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

作者:垄上行 时间:2021-06-06 01:26:54 

本文实例讲述了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程序设计有所帮助。

来源:http://www.cnblogs.com/apple2016/p/5747656.html

标签:Python,数据结构与算法,序列
0
投稿

猜你喜欢

  • ASP利用Google实现在线翻译功能

    2010-03-07 17:28:00
  • 基于python3+OpenCV实现人脸和眼睛识别

    2023-06-08 04:20:14
  • Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度

    2023-09-18 23:32:01
  • PHP简单实现HTTP和HTTPS跨域共享session解决办法

    2023-11-14 19:39:58
  • Oracle针对数据库某一行进行操作的时候,如何将这一行加行锁

    2009-03-06 10:37:00
  • python 获取网页编码方式实现代码

    2023-07-21 08:15:14
  • php中in_array函数用法探究

    2023-06-21 21:03:54
  • 理解绝对定位和相对定位布局

    2009-03-19 13:53:00
  • 使用Javascript实现选择下拉菜单互移并排序

    2023-09-07 18:14:45
  • Laravel框架文件上传功能实现方法示例

    2023-11-15 19:16:31
  • 解决Python logging模块无法正常输出日志的问题

    2023-10-03 17:04:25
  • 简单谈谈JS中的正则表达式

    2023-07-22 00:50:22
  • 在pytorch中计算准确率,召回率和F1值的操作

    2022-02-13 18:06:40
  • 跨浏览器使用剪贴板

    2008-09-27 13:26:00
  • js动态显示当前日期,时间和星期代码

    2007-08-14 12:31:00
  • 如何设计注册激活邮件

    2010-01-12 13:14:00
  • php函数之strtr和str_replace的用法详解以及效率分析

    2023-06-02 14:04:18
  • CSS用relative和absolute实现的图片定位效果

    2008-10-06 21:37:00
  • SQL Server 2005五个动态管理对象

    2009-02-24 17:41:00
  • 教程javascript的function(函数)

    2007-09-30 13:38:00
  • asp之家 网络编程 m.aspxhome.com