collections.namedtuple
是python中为了改善原始元组tuple
无法对内部数据进行命名的局限性而提供的一个工具包。这个工厂函数,来构造一个带字段名的元组。具名元组的实例和普通元组消耗的内存一样多,因为字段名都被存在对应的类里面。这个类跟普通的对象实例比起来也要小一些,因为 Python 不会用 __dict__
来存放这些实例的属性。
具名元组的定义如下
tuple1 = collections.namedtuple(typename, field_names, rename=False)
返回的是一个具名元组的对象
-
typename:元组名称
-
field_names: 元组内元素的名称
-
rename: 如果元素名称中含有 python 的关键字,则必须设置为 rename=True
from collections import namedtuple
# student = namedtuple('student', 'name sex age hobby')
student = namedtuple("student",
['name', # the name of student
'sex', # the sex of student
'age', # the sex of student
'hobby' # the hobby of student
])
stu = student("tom", 'man', 21, ['piano', 'basketball'])
print(stu)
print(stu.name)
print(stu.sex)
print(stu.age)
print(stu.hobby)
输出
student(name='tom', sex='man', age=21, hobby=['piano', 'basketball'])
tom
man
21
['piano', 'basketball']
代码中可以看出:
- 具名元组和元组具有同样的性质就是元素是可以有多种类型的
- 具名元组的第一个元素是具名元组的名称,第二个是元组内的元素名称。有两种方式:① 元素名称用空格隔开写在同一个字符串中 ② 元素名称用一个列表包起来。
我们可以用类似于对象.属性
的方式来访问里边元素的值。
除了直接创建对象的方式来创建,也可以用_make(list)
来进行对象的创建
stu02 = student._make(["paddy", 'man', 18, ['painting', 'riding']])
print(stu02)
输出
student(name='paddy', sex='man', age=18, hobby=['painting', 'riding'])
可以使用_replace(元素名=值)
修改元素的值
stu02 = stu02._replace(age=20)
print(stu02)
输出
student(name='paddy', sex='man', age=20, hobby=['painting', 'riding'])
还可以使用_asdict()
将具名元组转换为dict
这个字典是有序字典OrderedDict
print(stu02._asdict())
输出
OrderedDict([('name', 'paddy'), ('sex', 'man'), ('age', 20), ('hobby', ['painting', 'riding'])])