本文实例讲述了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()
方法来实现。该方法会创建一个全新的命名元组,并对相应的值做替换;
> s=s._replace(shares=75) > s Stock(name='ACMS', shares=75, price=123.45) >
_replace()
方法一个微妙的用途是它可以作为一种简便的方法填充具有可选或缺失字段的命名元组。
步骤:
1、创建一个包含默认值的“原型”元组;
2、使用_replace()
方法创建一个新实例,把相应的值替换掉;
from collections import namedtuple Stock = 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 Cookbook》)
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。