python - collections模块之namedtuple函数

namedtuple:

具名元祖,可以使tuple更加语义化,之前我们写一个元祖tuple,对内部元素不能进行命名,往往我们并不知道一个元祖所要表达的意义,而namedtuple很好的解决了此问题:(加强版tuple)

 

1、语法:(常用的2个参数)

· tuple_name 元祖的名称,为字符串,返回一个元组子类,所以我们要对这个对象进行命名。

· field_name 元祖中元素的名称,通常是一个可迭代的数据,也可以是以逗号隔开的元素名称

namedtuple('tuple_name', 'field_names')

 

2、创建namedtuple:

 创建一个具名元组,需要两个参数,一个是类名,另一个是类的各个字段名。后者可以是有多个字符串组成的可迭代对象,或者是以 空格 或 逗号分隔开的字段名组成的字符串:

User = namedtuple('User', ['name', 'age', 'height'])
# 或
User = namedtuple('User', 'name age height')
user = User('lxc', 22, 170)
print(user) # User(name='lxc', age=22, height=170)

 返回的是元祖的子类:

from collections import namedtuple
print(type(namedtuple('User', ['name', 'age']))) # <class 'type'>

也可以使用可变参数或收集关键字参数来传递:

User = namedtuple('User', ['name', 'age', 'height'])
tuple_list = ['lxc', 22, 170]
tuple_dict = {
    'name': 'lxc',
    'age': 20,
    'height': 170
}
user = User(*tuple_list)
user1 = User(**tuple_dict)
print(user) # User(name='lxc', age=22, height=170)
print(user1) # User(name='lxc', age=22, height=170)

 

3、取值:

普通元祖,只能通过 索引 来取值,而具名元祖不仅可以用索引来取值,还可以跟字典一样的取值方式:

User = namedtuple('User', ['name', 'age', 'height'])
tuple_list = ('lxc', 22, 170)
user = User(*tuple_list)
print(user.name)   # 'lxc'

 

4、赋值:

必须使用_replace方法,且参数为关键字参数

User = namedtuple('User', ['name', 'age', 'height'])
tuple_list = ('lxc', 22, 170)
user = User(*tuple_list)
user = user._replace(name='吕星辰')
print(user)  # User(name='吕星辰', age=22, height=170)

 

5、具名元祖的特有属性及方法:

除了元祖本身的属性方法之外,具名元祖有一些特有属性,常用地如下:

 (1)属性 _fileds  输出这个类的所有字段名的元祖

User = namedtuple('User', ['name', 'age', 'height'])
tuple_list = ('lxc', 22, 170)
user = User(*tuple_list)
print(user._fields) # ('name', 'age', 'height')

 (2)方法 _asdict() 把具名元祖以collection.OrdereDict的形似返回,实际上返回的就是创建字典的一种形式,可以使用dict()方法来创建对象:

User = namedtuple('User', ['name', 'age', 'height'])
tuple_list = ('lxc', 22, 170)
user = User(*tuple_list)
print(user._asdict()) # OrderedDict([('name', 'lxc'), ('age', 22), ('height', 170)])
print(dict(user._asdict())) # {'name': 'lxc', 'age': 22, 'height': 170}

 

6、与普通元祖性能对比:

具名元组和普通元组所需要的内存空间相同,所以 不必使用性能来权衡是否使用具名元组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值