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

解决方案:使用命名元组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))
>>> ================================ RESTART ================================
>>>
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))
>>> ================================ RESTART ================================
>>>
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】【数据结构与算法】18.将名称映射到序列的元素中的更多相关文章

  1. Python Cookbook 数据结构和算法

    1.查找最大或最小的N个元素 import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] print(heapq.nlargest(3, n ...

  2. [0x00 用Python讲解数据结构与算法] 概览

    自从工作后就没什么时间更新博客了,最近抽空学了点Python,觉得Python真的是很强大呀.想来在大学中没有学好数据结构和算法,自己的意志力一直不够坚定,这次想好好看一本书,认真把基本的数据结构和算 ...

  3. 《用Python解决数据结构与算法问题》在线阅读

    源于经典 数据结构作为计算机从业人员的必备基础,Java, c 之类的语言有很多这方面的书籍,Python 相对较少, 其中比较著名的一本 problem-solving-with-algorithm ...

  4. Python(一)数据结构和算法的20个练习题问答

    数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典.大多数情况下使用这些数据结构是很简单的. 但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题. 因此,这 ...

  5. [0x01 用Python讲解数据结构与算法] 关于数据结构和算法还有编程

    忍耐和坚持虽是痛苦的事情,但却能渐渐地为你带来好处. ——奥维德 一.学习目标 · 回顾在计算机科学.编程和问题解决过程中的基本知识: · 理解“抽象”在问题解决过程中的重要作用: · 理解并实现抽象 ...

  6. 【数据结构与算法】二叉树的 Morris 遍历(前序、中序、后序)

    前置说明 不了解二叉树非递归遍历的可以看我之前的文章[数据结构与算法]二叉树模板及例题 Morris 遍历 概述 Morris 遍历是一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1 ...

  7. python cookbook 数据结构

    保留最后n个元素: from collections import deque def search (lines, pattern, history=): previous_lines = dequ ...

  8. 数据结构与算法(3)- C++ STL与java se中的vector

    声明:虽然本系列博客与具体的编程语言无关.但是本文作者对c++相对比较熟悉,其次是java,所以难免会有视角上的偏差.举例也大多是和这两门语言相关. 上一篇博客概念性的介绍了vector,我们有了大致 ...

  9. python书籍推荐:Python Cookbook第三版中文

    所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/44/ 来源:python黑洞网 内容 ...

随机推荐

  1. http://www.cnblogs.com/littlemonk/p/5705476.html

    http://www.cnblogs.com/littlemonk/p/5705476.html

  2. iOS工程如何支持64-bit

    苹果在2014年10月20号发布了一条消息:从明年的二月一号开始,提交到App Store的应用必须支持64-bit.详细消息地址为:https://developer.apple.com/news/ ...

  3. notepad++代码折叠对应的树形结构快捷键

    树形层次,从1开始计数 <!doctype html> <html lang="en" class="1"> <head clas ...

  4. Ext4.0 获取选中行及遍历

    var grid= Ext.getCmp('grid'); var records=grid.getSelectionModel().getSelection(); if(records!=null& ...

  5. What algorithm to use to normalize someone's face on image

    http://stackoverflow.com/questions/7066104/what-algorithm-to-use-to-normalize-someones-face-on-image

  6. Android之创建自定义属性

    一. 在res/values 文件下定义一个attrs.xml 文件.代码如下: <?xml version="1.0" encoding="utf-8" ...

  7. system执行shell命令

    system - execute a shell command #include <stdlib.h> int system (const char *command); 描述 syst ...

  8. Fluentd安装——通过rpm方式

    0. td-agent是何物 为了灵活性,fluentd用Ruby写的,其中一些性能敏感的部件使用c写的.普通的用户直接安装和使用Ruby进程可能有困难,这样就把它封装成Fluentd的稳定版本——t ...

  9. 如何在makefile中写cd命令

    http://stackoverflow.com/questions/1789594/how-to-write-cd-command-in-makefile

  10. wpf 面试题目

    初级工程师 解释什么是依赖属性,它和以前的属性有什么不同?为什么在WPF会使用它?什么是样式什么是模板绑定(Binding )的基础用法解释这几个类的作用及关系: Visual, UIElement, ...