NamedTuple là một lớp khác nằm trong module collections. Giống như đối tượng kiểu dictionary, nó chứa các khóa được ánh xạ tới một số giá trị. Trong trường hợp này, chúng ta có thể truy cập các phần tử bằng cả khóa (keys) và chỉ mục (indexes).
Để sử dụng, trước tiên cần nhập module collections:
import collections
Phần này sẽ trình bày một số hàm của lớp NamedTuple.
Các phương thức truy cập NamedTuple
Từ NamedTuple, chúng ta có thể truy cập giá trị bằng chỉ mục, khóa và phương thức getattr(). Các giá trị thuộc tính của NamedTuple được sắp xếp theo thứ tự. Vì vậy, chúng ta có thể truy cập chúng bằng chỉ mục.
NamedTuple chuyển đổi tên các trường (field names) thành các thuộc tính. Do đó, sử dụng getattr() có thể lấy dữ liệu từ thuộc tính đó.
Mã ví dụ
import collections as col
# Tạo NamedTuple Employee
Employee = col.namedtuple('Employee', ['name', 'city', 'salary'])
# Thêm hai nhân viên
e1 = Employee('Asim', 'Delhi', '25000')
e2 = Employee('Bibhas', 'Kolkata', '30000')
# Truy cập phần tử bằng chỉ mục
print('Tên và lương của e1: ' + e1[0] + ' và ' + e1[2])
# Truy cập phần tử bằng tên thuộc tính
print('Tên và lương của e2: ' + e2.name + ' và ' + e2.salary)
# Truy cập phần tử bằng getattr()
print('Thành phố của e1 và e2: ' + getattr(e1, 'city') + ' và ' + getattr(e2, 'city'))
Kết quả
Tên và lương của e1: Asim và 25000 Tên và lương của e2: Bibhas và 30000 Thành phố của e1 và e2: Delhi và Kolkata
Các thủ tục chuyển đổi NamedTuple
Có một số phương thức để chuyển đổi các collection khác sang NamedTuple. Phương thức _make() có thể dùng để chuyển đổi một đối tượng iterable như list, tuple, v.v. sang đối tượng NamedTuple.
Chúng ta cũng có thể chuyển đổi đối tượng kiểu dictionary sang NamedTuple. Để chuyển đổi này, chúng ta cần toán tử **.
NamedTuple có thể trả về giá trị với khóa dưới dạng đối tượng OrderedDict. Để làm cho nó thành OrderedDict, ta phải dùng phương thức _asdict().
Mã ví dụ
import collections as col
# Tạo NamedTuple Employee
Employee = col.namedtuple('Employee', ['name', 'city', 'salary'])
# List giá trị chuyển thành Employee
my_list = ['Asim', 'Delhi', '25000']
e1 = Employee._make(my_list)
print(e1)
# Dict chuyển thành Employee
my_dict = {'name':'Bibhas', 'city' : 'Kolkata', 'salary' : '30000'}
e2 = Employee(**my_dict)
print(e2)
# Hiển thị named tuple dưới dạng dictionary
emp_dict = e1._asdict()
print(emp_dict)
Kết quả
Employee(name='Asim', city='Delhi', salary='25000')
Employee(name='Bibhas', city='Kolkata', salary='30000')
OrderedDict([('name', 'Asim'), ('city', 'Delhi'), ('salary', '25000')])
Một số thao tác bổ sung trên NamedTuple
Có các phương thức khác như _fields() và _replace(). Sử dụng _fields() ta có thể kiểm tra các trường khác nhau của NamedTuple. Phương thức _replace() dùng để thay thế giá trị của một trường bằng giá trị khác.
Mã ví dụ
import collections as col
# Tạo NamedTuple Employee
Employee = col.namedtuple('Employee', ['name', 'city', 'salary'])
# Thêm một nhân viên
e1 = Employee('Asim', 'Delhi', '25000')
print(e1)
print('Các trường của Employee: ' + str(e1._fields))
# Thay thế thành phố của nhân viên e1
e1 = e1._replace(city='Mumbai')
print(e1)
Kết quả
Employee(name='Asim', city='Delhi', salary='25000')
Các trường của Employee: ('name', 'city', 'salary')
Employee(name='Asim', city='Mumbai', salary='25000')