OrderedDict trong Python

Category: Python

OrderedDict là một lớp con của dict từ điển tích hợp của Python , ghi nhớ thứ tự các khóa được chèn vào. Không giống như các phiên bản Python cũ hơn , trong đó các từ điển không đảm bảo thứ tự, OrderedDict bảo toàn thứ tự chèn một cách đáng tin cậy.

Lưu ý: Từ Python 3.7 trở đi, dict tích hợp cũng bảo toàn thứ tự chèn như một tính năng ngôn ngữ chính thức. Vì vậy, OrderedDict chủ yếu hữu ích nếu bạn:

  • Làm việc với các phiên bản Python trước 3.7.

  • Cần thêm các tính năng như sắp xếp lại chìa khóa hoặc sắp xếp các mặt hàng theo thứ tự LIFO/FIFO.

OrderedDict so với dict trong Python

Hiểu OrderedDictdict là quan trọng vì cả hai đều bảo toàn thứ tự chèn (dict kể từ Python 3.7), nhưng OrderedDict cung cấp các tính năng bổ sung như sắp xếp lại khóa và bật các mục từ cả hai đầu, giúp kiểm soát tốt hơn. Xem bảng so sánh bên dưới để rõ hơn.

Tính năng

Từ điển

OrderedDict

Duy trì thứ tự chèn

Yes

Yes

Cho phép sắp xếp lại khóa

No

Yes (move_to_end(key, last=True))

Lấy các mục ra khỏi đầu

No (only popitem() removes last item)

Yes (popitem(last=True/False)supports both ends)

Kiểm tra sự bình đẳng xem xét thứ tự

No (order ignored)

Yes (order matters)

Hiệu suất

Faster

Slightly slower

Ví dụ:

from collections import OrderedDict

print("dict")
d = {}
d['a'] = 1
d['b'] = 2
d['c'] = 3
d['d'] = 4

for key, val in d.items():
    print(key, val)

print("ordered dict")
od = OrderedDict()
od['d'] = 4
od['b'] = 2
od['a'] = 1
od['c'] = 3

for key, val in od.items():
    print(key, val)

Đầu ra:

dict
a 1
b 2
c 3
d 4
ordered dict
d 4
b 2
a 1
c 3

Giải thích:

  • Phần đầu tiên tạo một từ điển thông thường d , thêm các khóa theo thứ tự và in chúng ra, hiển thị thứ tự chèn.

  • Phần thứ hai tạo một OrderedDict od với các khóa được thêm theo thứ tự khác nhau và in chúng ra, đồng thời giữ nguyên thứ tự đó.

Ví dụ & tính năng chính

Hãy cùng khám phá một số ví dụ để hiểu cách OrderedDict hoạt động và xem các tính năng chính của nó khi sử dụng.

1. Bảo toàn thứ tự chèn

OrderedDict duy trì trình tự chính xác như các phần tử được thêm vào. Điều này đặc biệt hữu ích trong các ứng dụng như tuần tự hóa JSON, xử lý trường biểu mẫu hoặc hiển thị nhật ký, trong đó thứ tự các mục mang ý nghĩa ngữ nghĩa.

from collections import OrderedDict

d = {'a': 1, 'b': 2, 'c': 3}
for k, v in d.items():
    print(k, v)

print("OrderedDict:")
od = OrderedDict([('d', 4), ('b', 2), ('a', 1), ('c', 3)])
for k, v in od.items():
    print(k, v)

Đầu ra:

a 1
b 2
c 3
OrderedDict:
d 4
b 2
a 1
c 3

Giải thích: Mã này tạo một từ điển thông thường d và in các mục của nó theo thứ tự chèn. Sau đó, nó tạo một OrderedDict od với các khóa theo thứ tự khác và in chúng, cho thấy cách OrderedDict bảo toàn trình tự chèn chính xác.

2. Thay đổi giá trị không ảnh hưởng đến thứ tự

Trong OrderedDict, việc sửa đổi giá trị của khóa hiện tại không làm thay đổi vị trí của khóa đó trong thứ tự. Điều này có nghĩa là bạn có thể cập nhật các giá trị mà không ảnh hưởng đến thứ tự khóa gốc.

from collections import OrderedDict

od = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
od['c'] = 5  

for k, v in od.items():
    print(k, v)

Đầu ra:

a 1
b 2
c 5
d 4

Giải thích: Mã này tạo một OrderedDict od với các khóa 'a', 'b', 'c' và 'd'. Sau đó, nó cập nhật giá trị của khóa 'c' thành 5. Khi in, các khóa vẫn giữ nguyên thứ tự ban đầu, cho thấy việc thay đổi giá trị không ảnh hưởng đến thứ tự khóa trong OrderedDict.

3. Kiểm tra sự bình đẳng xem xét thứ tự

Không giống như các dict thông thường, OrderedDict kiểm tra cả nội dung và thứ tự để xem có bằng nhau không, do đó các thứ tự khác nhau làm cho chúng không bằng nhau. Điều này hữu ích khi thứ tự quan trọng.

from collections import OrderedDict

od1 = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
od2 = OrderedDict([('c', 3), ('b', 2), ('a', 1)])

print(od1 == od2)

Đầu ra:

False

Giải thích: Mã này tạo ra hai OrderedDicts od1od2 , với cùng khóa và giá trị nhưng theo thứ tự khác nhau. Khi so sánh chúng, kết quả là False vì OrderedDicts xem xét cả nội dung và thứ tự của khóa để đảm bảo tính bình đẳng.

4. Đảo ngược một orderedDict

OrderedDict không có phương thức .reverse() tích hợp sẵn, nhưng bạn có thể đảo ngược thứ tự của nó bằng cách sử dụng hàm turnedover() của Python trên list(od.items()). Việc tạo một OrderedDict mới từ danh sách đảo ngược này sẽ giữ nguyên thứ tự đảo ngược.

from collections import OrderedDict

d1 = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
d2 = OrderedDict(reversed(list(d1.items())))

for k, v in d2.items():
    print(k, v)

Đầu ra:

c 3
b 2
a 1

Giải thích: Mã này tạo một OrderedDict d1 với các khóa 'a', 'b' và 'c'. Sau đó, nó đảo ngược thứ tự các mục của d1 bằng cách sử dụng turnedover() và tạo một OrderedDict d2 mới với thứ tự đảo ngược này.

5. Pop mục cuối cùng hoặc đầu tiên

popitem() trong OrderedDict xóa phần tử cuối cùng nếu last=True (mặc định) hoặc phần tử đầu tiên nếu last=False, giúp ích cho ngăn xếp và hàng đợi.

from collections import OrderedDict
d = OrderedDict([('a', 1), ('b', 2), ('c', 3)])

res = d.popitem(last=True) # Xóa mục được chèn cuối cùng
print(res)

Đầu ra

('c', 3)

Giải thích: Đoạn mã này xóa và trả về phần tử cuối cùng ('c', 3) khỏi OrderedDict bằng cách sử dụng popitem(last=True) .

6. Di chuyển các phím ra phía trước hoặc cuối

Với phương thức move_to_end() , OrderedDict cung cấp tính linh hoạt để định vị lại các phím. Bạn có thể đẩy một phím cụ thể vào đầu hoặc cuối từ điển mà không cần xóa và chèn lại.

from collections import OrderedDict
d = OrderedDict([('a', 1), ('b', 2), ('c', 3)])

d.move_to_end('a')         # Di chuyển 'a' đến cuối
d.move_to_end('b', last=False)  # Di chuyển 'b' lên phía trước
for k, v in d.items():
    print(k, v)

Đầu ra:

b 2
c 3
a 1

Giải thích: Mã này di chuyển khóa 'a' đến cuối OrderedDict và di chuyển 'b' lên phía trước. Khi được in, các khóa xuất hiện theo thứ tự: 'b', 'c', 'a'.

7. Xóa và chèn lại khóa

Việc xóa và chèn lại khóa trong OrderedDict sẽ di chuyển khóa đó đến cuối, giữ nguyên thứ tự chèn hữu ích cho việc theo dõi các hành động gần đây hoặc cập nhật các mục nổi bật.

from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
od.pop('c')    # Xóa 'c'

for k, v in od.items():
    print(k, v)

od['c'] = 3   # Chèn lại 'c' vào cuối
for k, v in od.items():
    print(k, v)

Đầu ra

a 1 
b 2 
d 4 
a 1 
b 2 
d 4 
c 3

Giải thích: Mã này xóa khóa 'c' khỏi OrderedDict, sau đó in các mục còn lại. Sau đó, nó chèn lại 'c' với giá trị của nó ở cuối và in lại tất cả các mục.

Những cân nhắc khác

  • Trong Python 2.7, OrderedDict sử dụng nhiều bộ nhớ hơn một dict thông thường do triển khai danh sách liên kết kép.

  • OrderedDict trong Python 2.7 không phải là lớp con của dict mà là một vùng chứa chuyên biệt từ mô-đun collections.

  • Từ Python 3.7 trở đi, các dict thông thường sẽ đảm bảo thứ tự chèn.

  • Phương thức popitem trong OrderedDict cho phép sử dụng như một ngăn xếp, cho phép triển khai như bộ đệm LRU.

Published on Jun 19, 2025