Cách sử dụng OrderedDict, một từ điển có thứ tự Python.

Kinh doanh

Từ điển Python (đối tượng kiểu dict) không bảo toàn thứ tự của các phần tử; CPython đã làm như vậy kể từ ngày 3.6, nhưng nó phụ thuộc vào việc triển khai và vô thời hạn trong các triển khai khác; đặc tả ngôn ngữ đã giữ nguyên thứ tự kể từ ngày 3.7.

OrderedDict được cung cấp trong mô-đun bộ sưu tập của thư viện chuẩn như một từ điển duy trì thứ tự. Nó là an toàn để sử dụng cái này.

Nhập mô-đun bộ sưu tập. Nó được bao gồm trong thư viện tiêu chuẩn và không cần cài đặt.

import collections

Nếu bạn viết như sau, bạn có thể bỏ qua các tập hợp. trong các ví dụ sau.

from collections import OrderedDict

Sau đây là mô tả về cách sử dụng OrderedDict.

  • Tạo một đối tượng OrderDict
  • OrderDict là một lớp con của dict
  • Di chuyển các phần tử đến đầu hoặc cuối
  • Thêm một phần tử mới ở bất kỳ vị trí nào.
  • Sắp xếp lại (sắp xếp lại) các phần tử
  • Sắp xếp các phần tử theo khóa hoặc giá trị

Tạo một đối tượng OrderDict

Các constructor collection.OrderedDict () có thể được sử dụng để tạo một đối tượng OrderedDict.

Tạo một đối tượng OrderedDict trống và thêm các giá trị.

od = collections.OrderedDict()

od['k1'] = 1
od['k2'] = 2
od['k3'] = 3

print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

Cũng có thể chỉ định các đối số cho hàm tạo.

Bạn có thể sử dụng các đối số từ khóa, chuỗi các cặp khóa-giá trị (chẳng hạn như bộ giá trị (khóa, giá trị)), v.v. Cái sau có thể là một danh sách hoặc một bộ giá trị miễn là nó là một cặp khóa-giá trị.

print(collections.OrderedDict(k1=1, k2=2, k3=3))
print(collections.OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)]))
print(collections.OrderedDict((['k1', 1], ['k2', 2], ['k3', 3])))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

Cho đến phiên bản 3.5, thứ tự của các đối số từ khóa không được giữ nguyên, nhưng kể từ phiên bản 3.6, nó hiện được giữ nguyên.

Đã thay đổi trong phiên bản 3.6: Với việc chấp nhận PEP 468, thứ tự của hàm tạo OrderedDict và các đối số từ khóa được truyền cho phương thức update () được giữ nguyên.
collections — Container datatypes — Python 3.10.0 Documentation

Các từ điển bình thường (đối tượng kiểu dict) cũng có thể được chuyển cho hàm tạo, nhưng trong trường hợp triển khai mà kiểu dict không bảo toàn thứ tự, thì OrderedDict được tạo từ nó cũng sẽ không bảo toàn thứ tự.

print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

OrderDict là một lớp con của dict

OrderedDict là một lớp con của dict.

print(issubclass(collections.OrderedDict, dict))
# True

OrderedDict cũng có các phương thức giống như dict, và các phương thức để lấy, thay đổi, thêm và loại bỏ các phần tử cũng giống như dict.

print(od['k1'])
# 1

od['k2'] = 200
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

od.update(k4=4, k5=5)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('k4', 4), ('k5', 5)])

del od['k4'], od['k5']
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

Xem chi tiết bài viết sau.

Di chuyển các phần tử đến đầu hoặc cuối

Bạn có thể sử dụng phương thức riêng của OrderedDict move_to_end () để di chuyển một phần tử đến đầu hoặc cuối.

Chỉ định khóa làm đối số đầu tiên. Mặc định là di chuyển đến cuối, nhưng nếu đối số thứ hai cuối cùng là sai, đối số này sẽ được chuyển lên đầu.

od.move_to_end('k1')
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1)])

od.move_to_end('k1', False)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

Thêm một phần tử mới ở bất kỳ vị trí nào.

Có thể tạo một đối tượng OrderedDict mới với một phần tử mới được thêm vào ở một vị trí tùy ý. Cụ thể, điều này có thể được thực hiện trong luồng sau.

  1. Liệt kê các đối tượng dạng xem có thể lấy được bằng phương thức items () bằng cách sử dụng list ().
  2. Thêm một bộ (khóa, giá trị) các cặp khóa-giá trị trong phương thức insert () của danh sách
  3. Tạo một đối tượng mới bằng cách chuyển nó đến các bộ sưu tập phương thức khởi tạo.OrderedDict ()
l = list(od.items())
print(l)
# [('k1', 1), ('k2', 200), ('k3', 3)]

l.insert(1, ('kx', -1))
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)])

insert () chỉ định vị trí được chèn làm đối số đầu tiên và phần tử sẽ được chèn làm đối số thứ hai.

Trong ví dụ, một đối tượng mới được gán cho biến ban đầu và không có phần tử mới nào được thêm vào chính đối tượng ban đầu.

Sắp xếp lại (sắp xếp lại) các phần tử

Thay thế các phần tử là quá trình tương tự như trong ví dụ trên.

  1. Liệt kê các đối tượng dạng xem có thể lấy được bằng phương thức items () bằng cách sử dụng list ().
  2. Thay thế các phần tử trong danh sách
  3. Tạo một đối tượng mới bằng cách chuyển nó đến các bộ sưu tập phương thức khởi tạo.OrderedDict ()
l = list(od.items())
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

l[0], l[2] = l[2], l[0]
print(l)
# [('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)])

Nếu bạn muốn chỉ định một khóa và thay thế nó, hãy sử dụng phương thức index () để lấy chỉ mục (vị trí) từ danh sách các khóa như hình dưới đây.

l = list(od.items())
k = list(od.keys())
print(k)
# ['k2', 'kx', 'k1', 'k3']

print(k.index('kx'))
# 1

l[k.index('kx')], l[k.index('k3')] = l[k.index('k3')], l[k.index('kx')]
print(l)
# [('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

Sắp xếp các phần tử theo khóa hoặc giá trị

Tạo danh sách các bộ giá trị (khóa, giá trị) của các cặp khóa-giá trị được sắp xếp dựa trên đối tượng dạng xem có thể được phương thức items () thu được và chuyển nó vào các bộ sưu tập phương thức khởi tạo.OrderedDict () để tạo một đối tượng mới.

Việc sắp xếp được thực hiện bằng cách chỉ định một hàm ẩn danh (biểu thức lambda) trả về một khóa hoặc giá trị từ một bộ (khóa, giá trị) làm khóa đối số của hàm tích hợp sorted ().

Nếu bạn muốn đảo ngược thứ tự, hãy đặt đối số ngược của sorted () thành true.

print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

od_sorted_key = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[0])
)
print(od_sorted_key)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('kx', -1)])

od_sorted_value = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[1], reverse=True)
)
print(od_sorted_value)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])