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
投稿

猜你喜欢

  • sqlserver中的自定义函数的方法小结

    2024-01-24 22:14:11
  • python模块中pip命令的基本使用

    2023-09-28 22:44:20
  • Python利用capstone实现反汇编

    2022-08-08 17:50:52
  • Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的

    2021-10-23 19:00:50
  • python定时任务apscheduler的详细使用教程

    2023-03-30 07:48:05
  • 微信小程序 滚动选择器(时间日期)详解及实例代码

    2024-01-27 22:57:53
  • python 实现客户端与服务端的通信

    2023-11-19 01:28:33
  • Python大数据量文本文件高效解析方案代码实现全过程

    2023-01-18 04:57:01
  • JS中把函数作为另一函数的参数传递方法(总结)

    2024-05-05 09:14:39
  • 基于JS实现移动端向左滑动出现删除按钮功能

    2024-04-17 09:51:07
  • Z-Blog垃圾留言判定新方法

    2009-07-06 13:04:00
  • python 函数传参之传值还是传引用的分析

    2021-08-20 13:06:34
  • Python pass 语句使用示例

    2022-05-01 16:49:55
  • 关于Python网络爬虫requests库的介绍

    2021-10-20 23:13:52
  • 一个asp版XMLDOM操作类

    2011-04-19 10:50:00
  • python代码实现将列表中重复元素之间的内容全部滤除

    2023-11-17 18:17:32
  • django表单实现下拉框的示例讲解

    2022-03-24 09:18:25
  • PHP中的闭包function() use() {}使用场景和技巧

    2023-06-09 21:54:07
  • Python中if语句的基本格式实例代码

    2023-12-02 14:31:20
  • JS获取页面窗口实际大小函数

    2008-01-28 13:18:00
  • asp之家 网络编程 m.aspxhome.com