其他分享
首页 > 其他分享> > python进阶(26)collections标准库

python进阶(26)collections标准库

作者:互联网

namedtuple

namedtuple的由来

因为元组的局限性:不能为元组内部的数据进行命名,所以往往我们并不知道一个元组所要表达的意义,所以引入namedtuple这个工厂函数,来构造一个带字段名的元组。namedtuple继承自tuple
命名元组赋予每个位置一个含义,提供可读性。它们可以用于任何普通元组,并添加了通过名字获取值的能力,通过索引值也是可以的。

namedtuple的格

highlighter- Python
collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)

namedtuple声明以及实例化

我们首先创建一个User类,定义3个字段nameageheight,并给age设置默认值为18,给height设置了默认值18

python
User = namedtuple('User', ['name', 'age', 'height'], defaults=(18, 180))
print(User.__mro__)

我们查看结果


python
(<class '__main__.User'>, <class 'tuple'>, <class 'object'>)

可以看到我们声明的User类是继承于tuple,接下来我们创建实例

python
user1 = User(name='jkc')
user2 = User(name='jkc2', age=20, height=198)
print(user1)
print(user2)
print(user1.name)
print(user2.age)

运行结果为

python
User(name='jkc', age=18, height=180)
User(name='jkc2', age=20, height=198)
jkc
20

namedtuple的方法和属性

命名元组还支持三个额外的方法和两个属性。为了防止字段名冲突,方法和属性以下划线开始。
_make(iterable) 类方法从存在的序列或迭代实例创建一个新实例。

python
>>> t = ['jkc3', 25, 190]
>>> User._make(t)
User(name='jkc3', age=25, height=190)

_asdict() 返回一个新的 dict ,它将字段名称映射到它们对应的值

python
>>> user4 = User(name='jkc4', age=28, height=200)
>>> user4._asdict()
{'name': 'jkc4', 'age': 28, 'height': 200}

_replace(**kwargs) 返回一个新的命名元组实例,并将指定域替换为新的值

python
>>> user5 = User(name='jkc5', age=30, height=210)
>>> user5._replace(age=18)
User(name='jkc5', age=30, height=210)

_fields 字符串元组列出了字段名。用于提醒和从现有元组创建一个新的命名元组类型

python
>>> user5._fields        
('name', 'age', 'height')

_field_defaults 字典将字段名称映射到默认值。

python
>>> User._field_defaults
{'name': 'jkc', 'age': 18, 'height': 180}

转换一个字典到命名元组,使用 ** 两星操作符

python
>>> d = {'name': 'jkc6', 'age': 18, 'height': 180}
>>> User(**d)
User(name='jkc6', age=18, height=180)

OrderedDict

有序字典就像常规字典一样,但有一些与排序操作相关的额外功能。由于内置的 dict 类获得了记住插入顺序的能力(在 Python 3.7 中保证了这种新行为),它们变得不那么重要了。

与dict类的区别

标签:python,数据,语言,NumPy,ipython,shell,科学家
来源: