每日一包 - collections.namedtuple

139 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

介绍

namedtuple是可以生成使用名字来访问元素内容的tuple子类,namedtuple给元组中的每个元素赋予一个名字,也就是说相对于python内置的tuple来讲,namedtuple添加了可以通过名字来访问元素的能力,当然也可以通过索引的方式获取值。

使用

参数介绍

namedtuple(typename,field_names,*,verbose=False, rename=False, module=None)
​
- typename: 指定创建tuple子类的类型,相当于创建了一个新的tuple子类
    
- field_names: 字符串序列,如[x, y]。此外field_names也可以直接使用单个字符串代表所有的字段名,多个字段名用空格或者逗号分隔,如'x y' or 'x, y',任何有效的python标识符都可以作为字段名(不能以下划线 数字开头, 不能是python中的关键字)
    
- rename: 如果该参数的值是True, 无效的字段名将会被自动替换为对应元素的索引值,如['abc','def','ghi','abc'],它将会被替换为 ['abc', '_1','ghi','_3'],这是因为 def 字段名是关键字,而 abc 字段名重复了。
    
verbose:如果该参数被设为 True,那么当该子类被创建后,该类定义就被立即打印出来。

应用案例

python的元组是不可变数据类型,其中存放的元素通常是同类型的数据,比如csv文件或者数据库中的每行数据也可以存放在一个元组中,比如下属示例:

t = ("shanghai", "China", "2500W")

上述元组中有三个元素,但是每个元素表示的意思并没有被清楚的表达出来,t[0]表示城市名称,t[1]表示城市所属国家,t[2]表示城市人数。为了能够让元组也能够像字典那样通过一个名字获取到对应的值并且知道每个值对应的含义,这个时候就可以使用namedtuple来生成一个类,从而明确的命名元组中的每个元素表示的意思。

from collections import namedtuple
​
City = namedtuple("City", ["city_name", "country", "population"])

这样我们就得到了一个通过namedtuple获得的自定义类,然后通过实例化这个自定义类就可以得到一个可以通过名字获取值的元组了。

city = City("shanghai", "China", "2500W")

元组中的每个值就可以通过对应的名字或者是索引获取了。

print(city.city_name, city[0])  # shanghai shanghai
print(city.country, city[1])  # China China
print(city.population, city[2])  # 2500W 2500W

其他方法

namedtuple除了继承了元组本身的方法之外还提供了一些额外的方法供我们使用。这里需要提示的一点是,在python中以_开头的方法通常被认为是私有的,但是在namedtuple中这些方法是公开的。

_asdict()

该方法可以将一个namedtuple实例转换成一个字典。字典的key对应的就是每个元素的名称。

print(city._asdict())  
# {'city_name': 'shanghai', 'country': 'China', 'population': '2500W'}

_make(iterable)

类方法,根据可迭代对象创建一个新的实例。

city = City._make(["shanghai", "China", "2500W"])
print(city)  # City(city_name='shanghai', country='China', population='2500W')

_fields

列出namedtuple的字段名。

print(city._fields)  # ('city_name', 'country', 'population')

getattr()

通过对象和属性名的字符串获取对应的属性的值。

res = getattr(city, "country")
print(res)  # China

总结

在实际开发中,合理灵活的使用namedtuple可以让我们的代码更加高效和简洁。