具名元组的定义
Python标准库collections中定义了具名元组(namedtuple)工厂函数,它可以构建带字段名的元组。
工厂函数参数详解
变量名 = namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
namedtuple工厂函数的参数详解:
typename:定义具名元组的名称,字符串型。
field_names:定义具名元组的字段名。该参数可以使用2种格式:
-
内部元素都是字符串的列表或元组;
例如['商品','单价',’数量']或('商品','单价',’数量')
-
以英文逗号','分隔的长字符串。字段名必须符合以下规则:
例如'商品,单价,数量'
字段名命名规则:
- 不能与关键字重名
- 不能以下划线开头
- 以字母(包括汉字)开头,由字母、数字、下划线组成。
rename:默认是False,意思是必须指定字段名。若为True,系统会对缺省的、重复的字段名自动重命名为'_索引值'。
defaults:设置默认值,可以是列表、元组,当字段数量大于defaults的元素数量时,后面的字段获得缺省值。
例如字段名有'a','b','c'这3个,缺省值给了'1','2'两个缺省值时,'b'=1,'c'=2。
module:设置所属模块,默认是'__main__'。
读取文件到具名元组
具名元组使用案例如下:
from collections import namedtuple
def file_to_list(file):
with open(file, encoding='utf8') as f:
# 创建具名元组构造器,具名元组名称是goods,字段名源自文件首行(除去头尾空白符)
# 具名元组构造器的变量名是goods。
goods = namedtuple('goods', f.readline().strip())
fruit_list = []
for line in f:
if len(line) < 3: # 过滤空行及数据不完整的行。
continue
# 读取一行文件内容,去除头尾空白符,以','分割成列表
# 用*打散列表,将列表中的元素分别作为参数传入goods具名元组构造器
line = goods(*(line.strip().split(',')))
fruit_list.append(line)
return fruit_list
l1 = file_to_list('list.txt')
print(l1[0])
print(l1[0].商品, l1[1].单价, l1[1].数量)
print(l1[1][0], l1[1][1], l1[1][2])
print(l1[2][0], l1[1][1:3])
out:
goods(商品='苹果', 单价='4.8', 数量='5')
苹果 2.9 10
雪梨 2.9 10
大枣 ('2.9', '10')
通过以上案例可以了解怎么创造具名元组构造器,怎么用具名元组构造器创建具名元组。
具名元组的优点
具名元组有以下几个优点:
- 具名元组是元组的子类,继承了元组的所有特性,也就是说具名元组可以用所有元组可用的方法和属性。
- 具名元组和元组存储数据消耗的内存是一样的,与字典相比大大节省空间。
- 具名元组可以用字段名访问数据,大大提高代码的可读性。