gpt4 book ai didi

Python cookbook(数据结构与算法)将名称映射到序列元素中的方法

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Python cookbook(数据结构与算法)将名称映射到序列元素中的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

本文实例讲述了Python将名称映射到序列元素中的方法。分享给大家供大家参考,具体如下:

问题:希望通过名称来访问元素,减少结构中对位置的依赖性 。

解决方案:使用命名元组collections.namedtuple()。它是一个工厂方法,返回的是python中标准元组类型的子类,提供给它一个类型名称以及相应的字段名称,它就返回一个可实例化的类,为你以定义好的字段名称传入值等.

命名元组的主要作用在于将代码同它所控制的元素位置间进行解耦 。

?
1
2
3
4
5
6
7
8
9
>>> 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). 。

?
1
2
3
4
5
6
7
8
>>> len (subscriber)
2
>>> addr,joined = subscriber
>>> addr
'lucy@example.com'
>>> joined
'2016-8-7'
>>>

使用普通元组的代码:

?
1
2
3
4
5
def compute_cost(records):
   total = 0.0
   for rec in records:
     total + = rec[ 1 ] * rec[ 2 ]
   return total

通过位置来引用元素使得代码的表达力不够,而且也依赖于记录的具体结构.

下面是使用命名元组的版本:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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))

运行结果:

?
1
65912.5

补充:

如果要构建涉及字典的大型数据结构,使用namedtuple会更加有效。但是注意,与字典不同的是,namedtuple是不可变的。例如:

?
1
2
3
4
5
6
7
8
9
>>> 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()方法来实现。该方法会创建一个全新的命名元组,并对相应的值做替换; 。

?
1
2
3
4
>>> s = s._replace(shares = 75 )
>>> s
Stock(name = 'ACMS' , shares = 75 , price = 123.45 )
>>>

_replace()方法一个微妙的用途是它可以作为一种简便的方法填充具有可选或缺失字段的命名元组.

步骤:

1、创建一个包含默认值的“原型”元组; 。

2、使用_replace()方法创建一个新实例,把相应的值替换掉; 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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))

运行结果:

?
1
2
3
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程序设计有所帮助.

原文链接:http://www.cnblogs.com/apple2016/p/5747656.html 。

最后此篇关于Python cookbook(数据结构与算法)将名称映射到序列元素中的方法的文章就讲到这里了,如果你想了解更多关于Python cookbook(数据结构与算法)将名称映射到序列元素中的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com