Namedtuple 介绍

python
本文介绍了python的namedtuple数据类型。

tuple的不足

Python的tuple类型可通过下标访问,但存在两个不足:

  1. 可通过下标访问,但是不能通过有意义的名字访问
  2. tuple为特设(ad-hoc)类型,没有约束条件,特别是在对tuple做比较操作时,没有关于长度、每个值在哪个位置约束

namedtuple的特点

namedtuple在保留tuple特性的同时,可弥补以上两个不足。

namedtuple的特点:

  1. 不可修改:和tuple一样,值一旦写入就不可修改
  2. 每个值都可以通过可读性好的标识符(需要自己定义)去访问,可以不用记忆每个下标是干嘛的,增强代码的可读性。

namedtuple示例

这个例子展示了如何定义namedtuple,以及如何访问namedtuple里的元素

1
2
3
4
5
6
7
8
9
from collections import namedtuple

Car = namedtuple('Car', 'color, miles')

car1 = Car('red', 34)
car2 = Car('yellow', 27)

print(car1.color, car1.miles) # ('red', 34)
print(car2.color, car2.miles) # ('yellow', 27)

下面这个例子展示了namedtuple和tuple的相似性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from collections import namedtuple

Car = namedtuple('Car', 'color, miles')

car = Car('red', 34)

# 赋值
color, miles = car
print(color, miles) # ('red', 34)

# 通过下标访问
print(car[0], car[1]) # ('red', 34)

# 转化为tuple
print(tuple(car)) # ('red', 34)

从如上例子可以看出,namedtuple在日常使用中,和tuple最大的变化就是可以如何dict一样,通过有意义的标识符进行访问,其他的操作仍然和tuple保持一致。

namedtuple的妙用

namedtuple利用_make方法,在从文件中读取内容,和从数据库中读取内容时,可以巧妙的和列名结合起来。

1
2
3
4
5
6
7
8
9
10
11
12
mployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
print emp.name, emp.title

import sqlite3
conn = sqlite3.connect('/companydata')
cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
for emp in map(EmployeeRecord._make, cursor.fetchall()):
print emp.name, emp.title

参考资料

0%