Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)將名稱(chēng)映射到序列元素中的方法
本文實(shí)例講述了Python將名稱(chēng)映射到序列元素中的方法。分享給大家供大家參考,具體如下:
問(wèn)題:希望通過(guò)名稱(chēng)來(lái)訪問(wèn)元素,減少結(jié)構(gòu)中對(duì)位置的依賴(lài)性
解決方案:使用命名元組collections.namedtuple()
。它是一個(gè)工廠方法,返回的是python中標(biāo)準(zhǔn)元組類(lèi)型的子類(lèi),提供給它一個(gè)類(lèi)型名稱(chēng)以及相應(yīng)的字段名稱(chēng),它就返回一個(gè)可實(shí)例化的類(lèi),為你以定義好的字段名稱(chēng)傳入值等。
命名元組的主要作用在于將代碼同它所控制的元素位置間進(jìn)行解耦
>>> from collections import namedtuple >>> Sub=namedtuple('Subscriber',['addr','joined']) >>> subscriber=Sub('lucy@example.com','2016-8-7') >>> subscriber Subscriber(addr='lucy@example.com', joined='2016-8-7') >>> subscriber.addr 'lucy@example.com' >>> subscriber.joined '2016-8-7'
namedtuple
的實(shí)例與普通的元組是可互換的,而且支持所有普通元組所支持的操作,例如索引和分解(unpacking).
>>> len(subscriber) 2 >>> addr,joined=subscriber >>> addr 'lucy@example.com' >>> joined '2016-8-7' >>>
使用普通元組的代碼:
def compute_cost(records): total = 0.0 for rec in records: total += rec[1] * rec[2] return total
通過(guò)位置來(lái)引用元素使得代碼的表達(dá)力不夠,而且也依賴(lài)于記錄的具體結(jié)構(gòu)。
下面是使用命名元組的版本:
# example.py from collections import namedtuple Stock = namedtuple('Stock', ['name', 'shares', 'price']) def compute_cost(records): total = 0.0 for rec in records: s = Stock(*rec) total += s.shares * s.price return total # Some Data records = [ ('GOOG', 100, 490.1), ('ACME', 100, 123.45), ('IBM', 50, 91.15) ] print(compute_cost(records))
運(yùn)行結(jié)果:
65912.5
補(bǔ)充:
如果要構(gòu)建涉及字典的大型數(shù)據(jù)結(jié)構(gòu),使用namedtuple會(huì)更加有效。但是注意,與字典不同的是,namedtuple是不可變的。例如:
>>> s=Stock('ACMS',100,123.45) >>> s Stock(name='ACMS', shares=100, price=123.45) >>> s.shares=75 Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> s.shares=75 AttributeError: can't set attribute >>>
若要修改屬性,可使用namedtuple實(shí)例的_replace()
方法來(lái)實(shí)現(xiàn)。該方法會(huì)創(chuàng)建一個(gè)全新的命名元組,并對(duì)相應(yīng)的值做替換;
>>> s=s._replace(shares=75) >>> s Stock(name='ACMS', shares=75, price=123.45) >>>
_replace()
方法一個(gè)微妙的用途是它可以作為一種簡(jiǎn)便的方法填充具有可選或缺失字段的命名元組。
步驟:
1、創(chuàng)建一個(gè)包含默認(rèn)值的“原型”元組;
2、使用_replace()
方法創(chuàng)建一個(gè)新實(shí)例,把相應(yīng)的值替換掉;
from collections import namedtuple Stock = namedtuple('Stock', ['name', 'shares', 'price','date','time']) #創(chuàng)建一個(gè)包含默認(rèn)值的“原型”元組 stock_prototype=Stock('',0,0.0,None,None) #創(chuàng)建一個(gè)函數(shù)實(shí)現(xiàn)將字典轉(zhuǎn)化為Stock類(lèi)型 def dict_to_stock(s): return stock_prototype._replace(**s) a={'name':'ACMS','shares':100,'price':123.45} print(dict_to_stock(a)) b={'name':'ACMS','shares':100,'price':123.45,'date':'2016-08-08'} print(dict_to_stock(b)) c={'name':'ACMS','price':123.45} print(dict_to_stock(c))
運(yùn)行結(jié)果:
Stock(name='ACMS', shares=100, price=123.45, date=None, time=None) Stock(name='ACMS', shares=100, price=123.45, date='2016-08-08', time=None) Stock(name='ACMS', shares=0, price=123.45, date=None, time=None)
注意:如果我們的目標(biāo)是定義一個(gè)高效的數(shù)據(jù)結(jié)構(gòu),而且將來(lái)會(huì)修改各種實(shí)例屬性,那么不推薦namedtuple!
(代碼摘自《Python Cookbook》)
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- Python要求O(n)復(fù)雜度求無(wú)序列表中第K的大元素實(shí)例
- python-序列解包(對(duì)可迭代元素的快速取值方法)
- Python如何篩選序列中的元素的方法實(shí)現(xiàn)
- python如何統(tǒng)計(jì)序列中元素
- Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)篩選及提取序列中元素的方法
- Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)找出序列中出現(xiàn)次數(shù)最多的元素算法示例
- Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)從序列中移除重復(fù)項(xiàng)且保持元素間順序不變的方法
- 利用Python找出序列中出現(xiàn)最多的元素示例代碼
- python實(shí)現(xiàn)獲取序列中最小的幾個(gè)元素
- Python過(guò)濾序列元素的方法
相關(guān)文章
django中的auth模塊與admin后臺(tái)管理方法
這篇文章主要介紹了django中的auth模塊與admin后臺(tái)管理方法,包括auth模塊的常用方法及如何擴(kuò)展auth_user表,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09python 三種方法實(shí)現(xiàn)對(duì)Excel表格的讀寫(xiě)
這篇文章主要介紹了python 三種方法實(shí)現(xiàn)對(duì)Excel表格的讀寫(xiě),幫助大家更好的利用python處理表格,感興趣的朋友可以了解下2020-11-11Django contrib auth authenticate函數(shù)源碼解析
這篇文章主要介紹了Django contrib auth authenticate函數(shù)源碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Python3中urllib庫(kù)添加請(qǐng)求頭的兩種方式
Python?3中的urllib模塊可以用來(lái)處理URL,包括下載和上傳文件、創(chuàng)建和讀取cookie、訪問(wèn)Web?API等,本文給大家介紹Python3中urllib庫(kù)添加請(qǐng)求頭的兩種方式,感興趣的朋友一起看看吧2023-10-10python調(diào)用win32接口進(jìn)行截圖的示例
這篇文章主要介紹了python調(diào)用win32接口進(jìn)行截圖的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11Python實(shí)現(xiàn)購(gòu)物車(chē)程序
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)購(gòu)物車(chē)程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04python 進(jìn)程 進(jìn)程池 進(jìn)程間通信實(shí)現(xiàn)解析
這篇文章主要介紹了python 進(jìn)程 進(jìn)程池 進(jìn)程間通信實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08