Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)將名稱映射到序列元素中的方法
本文實例講述了Python將名稱映射到序列元素中的方法。分享給大家供大家參考,具體如下:
問題:希望通過名稱來訪問元素,減少結(jié)構(gòu)中對位置的依賴性
解決方案:使用命名元組collections.namedtuple()。它是一個工廠方法,返回的是python中標(biāo)準(zhǔn)元組類型的子類,提供給它一個類型名稱以及相應(yī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的實例與普通的元組是可互換的,而且支持所有普通元組所支持的操作,例如索引和分解(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
通過位置來引用元素使得代碼的表達(dá)力不夠,而且也依賴于記錄的具體結(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))
運行結(jié)果:
65912.5
補(bǔ)充:
如果要構(gòu)建涉及字典的大型數(shù)據(jù)結(jié)構(gòu),使用namedtuple會更加有效。但是注意,與字典不同的是,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實例的_replace()方法來實現(xiàn)。該方法會創(chuàng)建一個全新的命名元組,并對相應(yīng)的值做替換;
>>> s=s._replace(shares=75) >>> s Stock(name='ACMS', shares=75, price=123.45) >>>
_replace()方法一個微妙的用途是它可以作為一種簡便的方法填充具有可選或缺失字段的命名元組。
步驟:
1、創(chuàng)建一個包含默認(rèn)值的“原型”元組;
2、使用_replace()方法創(chuàng)建一個新實例,把相應(yīng)的值替換掉;
from collections import namedtuple
Stock = namedtuple('Stock', ['name', 'shares', 'price','date','time'])
#創(chuàng)建一個包含默認(rèn)值的“原型”元組
stock_prototype=Stock('',0,0.0,None,None)
#創(chuàng)建一個函數(shù)實現(xiàn)將字典轉(zhuǎn)化為Stock類型
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))
運行結(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)是定義一個高效的數(shù)據(jù)結(jié)構(gòu),而且將來會修改各種實例屬性,那么不推薦namedtuple!
(代碼摘自《Python Cookbook》)
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計有所幫助。
- Python要求O(n)復(fù)雜度求無序列表中第K的大元素實例
- python-序列解包(對可迭代元素的快速取值方法)
- Python如何篩選序列中的元素的方法實現(xiàn)
- python如何統(tǒng)計序列中元素
- 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ù)項且保持元素間順序不變的方法
- 利用Python找出序列中出現(xiàn)最多的元素示例代碼
- python實現(xiàn)獲取序列中最小的幾個元素
- Python過濾序列元素的方法
相關(guān)文章
python 三種方法實現(xiàn)對Excel表格的讀寫
這篇文章主要介紹了python 三種方法實現(xiàn)對Excel表格的讀寫,幫助大家更好的利用python處理表格,感興趣的朋友可以了解下2020-11-11
Django contrib auth authenticate函數(shù)源碼解析
這篇文章主要介紹了Django contrib auth authenticate函數(shù)源碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
python調(diào)用win32接口進(jìn)行截圖的示例
這篇文章主要介紹了python調(diào)用win32接口進(jìn)行截圖的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11
python 進(jìn)程 進(jìn)程池 進(jìn)程間通信實現(xiàn)解析
這篇文章主要介紹了python 進(jìn)程 進(jìn)程池 進(jìn)程間通信實現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08

