Python的元組不能為元組內部的數據進行命名,而 collections.namedtuple 可以來構造一個含有字段名稱的元組類,命名元組可以通過逗號+字段名來獲取元素值:
collections.namedtuple(typename, field_names)
返回一個命名元組類 typename,其中參數的意義如下:
- typename:類名稱
- field_names: 元組中元素的名稱
一,定義命名元組類
命名元組是一個類,有兩種方式來定義命名元組:
from collections import namedtuple User = namedtuple('User', ['name', 'age', 'id']) User = namedtuple('User', 'name age id')
實例化命名元組,獲得類的一個實例:
user = User('tester', '22', '464643123')
二,命名元組的屬性和方法
1,命名元組類的屬性和方法
- 類屬性 _fields:包含這個類所有字段名的元組
- 類方法 _make(iterable):接受一個可迭代對象來生產這個類的實例
# 通過類方法 _make() 和一個list創建一個User對象 user = User._make(['Runoob', 'male', 12]) User._fields
2,命名元組實例的方法
- 實例方法 _asdict():把具名元組以 collections.OrdereDict 的形式返回,可以利用它來把元組里的信息友好的展示出來
- 實例方法_replace():用於修改實例的屬性
# 獲取實例的屬性: print( user.name, user.sex, user.age) # 使用 _replace() 修改對象屬性 user = user._replace(age=22)# User(name='user1', sex='male', age=22) # 使用 _asdict()函數把 User對象轉換成字典 print( user._asdict() ) # OrderedDict([('name', 'Runoob'), ('sex', 'male'), ('age', 22)])
三,把字典或列表轉換為命名元組
1,把字典轉換為命名元組
可以把Python的字典轉換為命名元組:
>>> dt={'name':'b', 'age':2, 'id':135} >>> ut=User(**dt) ## User(name='b', age=2, id=135)
2,把列表轉換為命名元組
使用map函數,調用命名元組類的_make函數,把列表轉換為命名元組的列表
User = namedtuple('User', 'name age id') list_users=map(User._make,[('u1',23,1001),('u2',21,1002),('u3',25,1003),])
3,把命名元組轉換為列表
也可以把命名元組轉換為list,列表中只有值,而沒有字段名稱:
>>> list(ut) ['b', '2', 135]
四,訪問命名元組
通過逗號運算符和屬性名來訪問元組字段的值,例如,ut是命名元組的對象,name是對象的屬性,可以通過以下方式訪問元組的name屬性:
ut.name
五,命名元組的用途
命名元組在存儲csv
或者sqlite3
返回數據的時候特別有用
EmployeeRecord = 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)
參考文檔: