更多信息请前往官网网址:

https://docs.python.org/3.6/library/collections.html

8.3.5. namedtuple() 命名字段的元组的工场函数

命名元组为元组中的每个位置分配意义,并允许更可读,自我记录的代码。 它们可以在使用常规元组的地方使用,它们增加了通过名称而不是位置索引访问字段的能力。

collections.namedtuple(typename, field_names, *, verbose=False, rename=False, module=None)¶

返回名为typename的新元组子类。新的子类用于创建具有可通过属性查找访问的字段以及可索引和可​​迭代的元组类对象。子类的实例也有一个有用的docstring(带有typename和field_names)和一个有用的__repr __()方法,它以name = value格式列出元组内容。

field_names是诸如['x','y']的字符串序列。或者,field_names可以是单个字符串,每个字段名由空格和/或逗号分隔,例如“x y”或“x,y”。

任何有效的Python标识符可以用于字段名,除了以下划线开头的名称。有效的标识符由字母,数字和下划线组成,但不能以数字或下划线开头,不能是关键字,如class,for,return,global,pass或raise。

如果重命名为true,则无效的字段名称将自动替换为位置名称。例如,['abc','def','ghi','abc']转换为['abc','_1','ghi','_3'],消除关键字def和重复字段名abc 。

如果verbose为真,则类定义在构建后打印。此选项已过时;相反,打印_source属性更为简单。

如果定义了模块,则将所指定的元组的__module__属性设置为该值。

命名元组实例没有每个实例的字典,所以它们是轻量级的,不需要比常规元组更多的内存。

在版本3.1中更改:增加了对重命名的支持。

版本3.6更改:verbose和rename参数成为仅关键字参数。

在版本3.6中更改:添加了模块参数。

>>> #基本的例子
...
>>> Point = collections.namedtuple('Point',['x','y'])
>>> p = Point(11,y=22)
>>> p[0]
11
>>> p[0]+p[1]
33
>>> x,y = p
>>> x,y
(11, 22)
>>> p.x
11
>>> p
Point(x=11, y=22)

命名的元组对于将字段名称分配给csv或sqlite3模块返回的结果元组特别有用:

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
print(emp.name, emp.title) import sqlite3
conn = sqlite3.connect('/companydata')
cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
for emp in map(EmployeeRecord._make, cursor.fetchall()):
print(emp.name, emp.title)

除了从元组继承的方法,命名的元组还支持三个附加方法和两个属性。 为了防止与字段名称冲突,方法和属性名称以下划线开头。

classmethod somenamedtuple._make(iterable)

从现有序列或可迭代创建新实例的Class方法。

>>> t = [11, 22]
>>> Point._make(t)
Point(x=11, y=22)

somenamedtuple._asdict()

返回一个新的OrderedDict,将字段名称映射到相应的值:

>>> p
Point(x=11, y=22)
>>> p._asdict()
OrderedDict([('x', 11), ('y', 22)])

在版本3.1中更改:返回OrderedDict而不是常规的dict。

somenamedtuple._replace(**kwargs)  

返回namedTuple的新实例,用新值替换特定字段:

>>> p = Point(x=11, y=22)
>>> p._replace(x=33)
Point(x=33, y=22) >>> for partnum, record in inventory.items():
... inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())

somenamedtuple._source  

一个包含纯Python源代码的字符串,用于创建指定的元组类。 来源使得命名的元组自我记录。 它可以打印,使用exec()执行,或保存到文件并导入。

版本3.3中新增。

somenamedtuple._fields

字符串元组列出字段名称。 用于内省和从现有的指定元组创建新的命名元组类型。

>>> p._fields            # view the field names
('x', 'y') >>> Color = namedtuple('Color', 'red green blue')
>>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
>>> Pixel(11, 22, 128, 255, 0)
Pixel(x=11, y=22, red=128, green=255, blue=0)

要检索名称存储在字符串中的字段,请使用getattr()函数:

>>> getattr(p, 'x')
11

要将字典转换为指定的元组,请使用双星运算符(如“解包参数列表”中所述):

>>> d = {'x': 11, 'y': 22}
>>> Point(**d)
Point(x=11, y=22)

由于一个指定的元组是一个普通的Python类,所以很容易添加或更改一个子类的功能。 以下是如何添加计算字段和固定宽度的打印格式:

>>> class Point(namedtuple('Point', ['x', 'y'])):
... __slots__ = ()
... @property
... def hypot(self):
... return (self.x ** 2 + self.y ** 2) ** 0.5
... def __str__(self):
... return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot) >>> for p in Point(3, 4), Point(14, 5/7):
... print(p)
Point: x= 3.000 y= 4.000 hypot= 5.000
Point: x=14.000 y= 0.714 hypot=14.018

上面显示的子类将__slots__设置为空元组。 这有助于通过阻止创建实例字典来保持内存要求较低。

子类化对于添加新的存储字段无效。 相反,只需从_fields属性创建一个新的命名元组类型:

>>> Point3D = namedtuple('Point3D', Point._fields + ('z',))

可以通过对__doc__字段进行直接分配来定制Docstrings:

>>> Book = namedtuple('Book', ['id', 'title', 'authors'])
>>> Book.__doc__ += ': Hardcover book in active collection'
>>> Book.id.__doc__ = '13-digit ISBN'
>>> Book.title.__doc__ = 'Title of first printing'
>>> Book.authors.__doc__ = 'List of authors sorted by last name'

版本3.5更改:属性文本字符串变为可写。
可以使用_replace()来定制原型实例来实现默认值:

>>> Account = namedtuple('Account', 'owner balance transaction_count')
>>> default_account = Account('<owner name>', 0.0, 0)
>>> johns_account = default_account._replace(owner='John')
>>> janes_account = default_account._replace(owner='Jane')
也可以看看
Jan Kaliszewski的元类混合的名为tuple抽象基类的配方。 除了为命名元组提供抽象基类外,它还支持一个替代的基于元类的构造函数,方便使用命名元组进行子类化的用例。
请参阅types.SimpleNamespace()基于基础字典而不是元组的可变命名空间。
有关为命名元组添加类型提示的方式,请参阅typing.NamedTuple()。

  

  

  

  

  

  

  

  

python模块学习之collections的更多相关文章

  1. 【转】Python模块学习 - fnmatch & glob

    [转]Python模块学习 - fnmatch & glob 介绍 fnmatch 和 glob 模块都是用来做字符串匹配文件名的标准库. fnmatch模块 大部分情况下使用字符串匹配查找特 ...

  2. 【转】python模块分析之collections(六)

    [转]python模块分析之collections(六) collections是Python内建的一个集合模块,提供了许多有用的集合类. 系列文章 python模块分析之random(一) pyth ...

  3. 【目录】Python模块学习系列

    目录:Python模块学习笔记 1.Python模块学习 - Paramiko  - 主机管理 2.Python模块学习 - Fileinput - 读取文件 3.Python模块学习 - Confi ...

  4. Python模块学习filecmp文件比较

    Python模块学习filecmp文件比较 filecmp模块用于比较文件及文件夹的内容,它是一个轻量级的工具,使用非常简单.python标准库还提供了difflib模块用于比较文件的内容.关于dif ...

  5. python模块学习第 0000 题

    将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果: 好可爱>%<! 题目来源:https://github.com/Yixiao ...

  6. Python模块学习:logging 日志记录

    原文出处: DarkBull    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net ...

  7. 解惑Python模块学习,该如何着手操作...

    Python模块 晚上和朋友聊天,说到公司要求精兵计划,全员都要有编程能力.然后C.Java.Python-对于零基础入门的,当然是选择Python的人较多了.可朋友说他只是看了简单的语法,可pyth ...

  8. Python模块学习

    6. Modules If you quit from the Python interpreter and enter it again, the definitions you have made ...

  9. Python模块学习系列

    python模块-time python模块-datetime python模块-OS模块详解

随机推荐

  1. POJ 2082 Terrible Sets(单调栈)

    [题目链接] http://poj.org/problem?id=2082 [题目大意] 给出一些长方形下段对其后横向排列得到的图形,现在给你他们的高度, 求里面包含的最大长方形的面积 [题解] 我们 ...

  2. 【莫队算法】【权值分块】bzoj2223 [Coci 2009]PATULJCI

    不带修改主席树裸题<=>莫队+权值分块裸题. 复杂度O(m*sqrt(n)). P.S.题目描述坑爹,第二个数是权值的范围. #include<cstdio> #include ...

  3. duplicate symbol _gestureMinimumTranslation in:

    在真机上编译无误,在模拟器上编译报错:duplicate symbol _gestureMinimumTranslation in: /Users/Sam/Library/Developer/Xcod ...

  4. HTML-DEV-ToolLink(常用的在线字符串编解码、代码压缩、美化、JSON格式化、正则表达式、时间转换工具、二维码生成与解码等工具,支持在线搜索和Chrome插件。)

    HTML-DEV-ToolLink:https://github.com/easonjim/HTML-DEV-ToolLink 常用的在线字符串编解码.代码压缩.美化.JSON格式化.正则表达式.时间 ...

  5. css3的cursor

    1.cursor属性参考表 还有zoom-in/zoom-out 还有grab/grabbing 2.css (1)前面的基本上就 .xx { cursor: pointer; } (2)后面两个有兼 ...

  6. java获取桌面路径的方法

    FileSystemView fsv = FileSystemView.getFileSystemView(); File com=fsv.getHomeDirectory(); System.out ...

  7. iOS:实现图片的无限轮播

    为尊重原创,特注明原文链接:http://m.myexception.cn/operating-system/1949043.html 图片轮播及其无限循环效果 平时APP中的广告位或者滚动的新闻图片 ...

  8. IE8 XSS Filter Bypass

    漏洞说明:IE8是微软新推出的一款浏览器,其对CSS2.1的完整支持,HTML5的支持,内置开发工具等等.IE8在浏览器安全性上有非常大的改进,内置了一款无法卸载的Xss Filter,对非持久型跨站 ...

  9. CentOS7下nrpe3.0安装(转)

    本人菜鸟一枚,在学习nagios的时候碰到了很多问题,在网上找了很多相关的教程,都是老版本的,怎么装都不对,强迫症的我非要按装新版本,老版本的教程怎么搞都不行,只能自己研究了. 首先,下载nrpe3. ...

  10. IOS研究之多个UITextField的键盘处理

    在IOS开发中使用UITextField时常须要考虑的问题就是键盘的处理. 有时候,弹出的键盘会将UITextField区域覆盖,影响用户输入.这个时候就要将视图上移.这个时候我们须要考虑两点: 1, ...