国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python cookbook(數據結構與算法)將名稱映射到序列元素中的方法

2020-01-04 15:24:34
字體:
來源:轉載
供稿:網友

本文實例講述了Python將名稱映射到序列元素中的方法。分享給大家供大家參考,具體如下:

問題:希望通過名稱來訪問元素,減少結構中對位置的依賴性

解決方案:使用命名元組collections.namedtuple()。它是一個工廠方法,返回的是python中標準元組類型的子類,提供給它一個類型名稱以及相應的字段名稱,它就返回一個可實例化的類,為你以定義好的字段名稱傳入值等。

命名元組的主要作用在于將代碼同它所控制的元素位置間進行解耦

>>> from collections import namedtuple>>> Sub=namedtuple('Subscriber',['addr','joined'])>>> subscriber=Sub('lucy@example.com','2016-8-7')>>> subscriberSubscriber(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.pyfrom collections import namedtupleStock = 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 Datarecords = [  ('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)>>> sStock(name='ACMS', shares=100, price=123.45)>>> s.shares=75Traceback (most recent call last): File "<pyshell#2>", line 1, in <module>  s.shares=75AttributeError: can't set attribute>>>

若要修改屬性,可使用namedtuple實例的_replace()方法來實現。該方法會創建一個全新的命名元組,并對相應的值做替換;

>>> s=s._replace(shares=75)>>> sStock(name='ACMS', shares=75, price=123.45)>>>

_replace()方法一個微妙的用途是它可以作為一種簡便的方法填充具有可選或缺失字段的命名元組。

步驟:

1、創建一個包含默認值的“原型”元組;

2、使用_replace()方法創建一個新實例,把相應的值替換掉;

from collections import namedtupleStock = namedtuple('Stock', ['name', 'shares', 'price','date','time'])#創建一個包含默認值的“原型”元組stock_prototype=Stock('',0,0.0,None,None)#創建一個函數實現將字典轉化為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程序設計有所幫助。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 科技| 伊宁县| 玉树县| 亚东县| 萍乡市| 嘉峪关市| 太谷县| 申扎县| 凤城市| 揭东县| 易门县| 郸城县| 丰镇市| 政和县| 肥东县| 兴城市| 广饶县| 本溪市| 凉山| 报价| 清新县| 伊金霍洛旗| 体育| 永兴县| 乌审旗| 石屏县| 原平市| 通江县| 读书| 和静县| 怀来县| 长丰县| 杭锦后旗| 吉安县| 鲜城| 平湖市| 涡阳县| 张家川| 黔西| 陵水| 漳平市|