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