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

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. 【找规律】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) B. Code For 1

    观察一下,将整个过程写出来,会发现形成一棵满二叉树,每一层要么全是0,要么全是1. 输出的顺序是其中序遍历. 每一层的序号形成等差数列,就计算一下就可以出来每一层覆盖到的区间的左右端点. 复杂度O(l ...

  2. 【R笔记】使用R语言进行异常检测

    本文转载自cador<使用R语言进行异常检测> 本文结合R语言,展示了异常检测的案例,主要内容如下: (1)单变量的异常检测 (2)使用LOF(local outlier factor,局 ...

  3. pythonGUI编程用Canvas模拟画板

    代码如下: from tkinter import * import webbrowser root = Tk() w = Canvas(root,width=400,height=200) w.pa ...

  4. sun.misc.BASE64Decoder导入异常及处理思路

    Java后台保存base64图片数据 使用byte[] bytes = new BASE64Decoder().decodeBuffer(str);需要引入sun.misc.BASE64Decoder ...

  5. Kubernetes环境下调整WebLogic JVM基本参数

    基于Kubernetes启动WebLogic后,发现JVM的最大heap size一直在700多M左右,通过 kubectl logs 察看pod启动状态,发现日志中并没有-Xms和-Xmx参数.日志 ...

  6. Gitlab系列九之取消用户注册页面和删除用户

    一.取消用户注册页面 Admin Area--->Settings--->Sign-up enabled(取消前面的勾)---save 二.删除用户 Users----Destroy(点他 ...

  7. 通过案例对SparkStreaming透彻理解三板斧之一

    本节课通过二个部分阐述SparkStreaming的理解: 一.解密SparkStreaming另类在线实验 二.瞬间理解SparkStreaming本质 Spark源码定制班主要是自己做发行版.自己 ...

  8. fastestmirror不能使用

    fastestmirror不能使用,fastestmirror是yum的一个加速插件 处理办法就是禁用这个插件 方法两种 第一种 vi /etc/yum/pluginconf.d/fastestmir ...

  9. [Typescript] Improve Readability with TypeScript Numeric Separators when working with Large Numbers

    When looking at large numbers in code (such as 1800000) it’s oftentimes difficult for the human eye ...

  10. 淘宝Diamond架构分析

    转载:http://blog.csdn.net/szwandcj/article/details/51165954 早期的应用都是单体的,配置修改后,只要通过预留的管理界面刷新reload即可.后来, ...