Trước khi chúng ta hiểu từ điển được sắp xếp trong python là gì, trước tiên chúng ta hãy tóm tắt lại một từ điển trong python. Từ điển là một cấu trúc dữ liệu trong Python được sử dụng để lưu trữ các khóa và giá trị tương ứng của chúng. Mỗi mục trong từ điển là một cặp trong đó k là khóa và v là giá trị. Khóa k của cô ấy là duy nhất và Python không cho phép lặp lại các khóa. Tuy nhiên, các giá trị có thể được lặp lại
Ví dụ: hãy xem xét cơ sở dữ liệu của một cửa hàng bách hóa muốn lưu trữ giá sản phẩm của họ
products = {} products['banana'] = 12 products['shampoo'] = 100 products['cheese'] = 150
Từ điển về cơ bản giống như một bản đồ, trong đó mỗi bản ghi trong từ điển được gọi là một mục
Tuy nhiên, từ điển không nhớ thứ tự chèn các mục. Trong ví dụ trên, chúng tôi không biết thứ tự chính xác mà các mục được lưu trữ trong từ điển. Hãy để chúng tôi cố gắng in các mục
for [key in products]: print["key: " + key + ", value: " + str[products[key]]]
đầu ra
shampoo: 100 banana: 12 cheese: 150
Thứ tự của các mục trong đầu ra có thể khác với thứ tự lưu trữ các phần tử. Điều này là do các mục được lưu trữ bằng hàm băm của các khóa
Tuy nhiên, chúng tôi muốn kiểm soát thứ tự của các mục, đối với các trường hợp sử dụng khác nhau, một số trong số đó chúng tôi sẽ xem xét sau trong bài viết này. Đối với các trường hợp sử dụng như vậy, Python cung cấp cho chúng tôi từ điển được sắp xếp
Cú pháp của OrderedDict
Cú pháp của OrderedDict giống như một từ điển thông thường. Bạn cần nhập nó trước bằng cách sử dụng
from collections import OrderedDict
Để khởi tạo dict, chúng tôi sử dụng một hàm tạo khác
Tất cả các hoạt động khác giống như một lệnh thông thường
Chương trình Python để chứng minh hoạt động của OrderedDict
Hãy để chúng tôi nghiên cứu đoạn mã sau để hiểu cách thức hoạt động của OrderedDict
from collections import OrderedDict products = OrderedDict[] products['banana'] = 12 products['shampoo'] = 100 products['cheese'] = 150 for [key in products]: print["key: " + key + ", value: " + str[products[key]]]
đầu ra
banana: 12 shampoo: 100 cheese: 150
Chúng ta cũng có thể sử dụng hàm tạo có đối số để tạo OrderedDict
from collections import OrderedDict products = OrderedDict[banana=12, shampoo=100, cheese=150]
OrderedDict có một phương thức gọi là fromKeys[] để tạo một OrderedDict từ danh sách các khóa
from collections import OrderedDict keys = ['banana', 'shampoo', 'cheese'] OrderedDict.fromkeys[keys, 0] #assigns a default value of 0
Những điểm chính
hoạt động đột biến
OrderedDict là một cấu trúc dữ liệu có thể thay đổi, do đó chúng ta có thể thực hiện các thao tác sau trên nó
Việc chèn một mục diễn ra ở cuối từ điển
from collections import OrderedDict products = OrderedDict[banana=12, shampoo=100, cheese=150] #initialize an OrderedDict with elements present in it #insert a new item products['rice'] = 60
>>> products banana: 12 shampoo: 100 cheese: 150 rice: 60
Nếu một mục bị xóa và chèn lại, nó sẽ được thực hiện ở cuối từ điển
0for [key in products]: print["key: " + key + ", value: " + str[products[key]]]
1for [key in products]: print["key: " + key + ", value: " + str[products[key]]]
Việc sửa đổi giá trị của khóa thực hiện tại chỗ, điều này có nghĩa là vị trí của khóa không bị ảnh hưởng
2for [key in products]: print["key: " + key + ", value: " + str[products[key]]]
Chúng ta cũng có thể sử dụng phương thức update[] để cập nhật giá trị của khóa. update[] cũng là một phương pháp tại chỗ
Lặp lại thông qua một OrderedDict
Để lặp lại, chúng tôi truy cập mọi khóa và in giá trị của nó. Để đạt được điều này, chúng ta cần viết một vòng lặp; . Phép lặp vẫn giống như trong từ điển thông thường, chỉ là các mục được lặp theo thứ tự chúng được thêm vào OrderedDict
3for [key in products]: print["key: " + key + ", value: " + str[products[key]]]
đầu ra
4for [key in products]: print["key: " + key + ", value: " + str[products[key]]]
Trong tất cả các trường hợp trên, đầu ra là như nhau
5for [key in products]: print["key: " + key + ", value: " + str[products[key]]]
đầu ra
Các tính năng đặc biệt trong OrderedDict
Có một số phương thức đặc biệt có trong OrderedDict không có trong từ điển thông thường
Phương thức move_to_end[] có thể được sử dụng để dịch chuyển một mục ở cuối hoặc ở đầu từ điển
cú pháp
6for [key in products]: print["key: " + key + ", value: " + str[products[key]]]
Ví dụ
7for [key in products]: print["key: " + key + ", value: " + str[products[key]]]
đầu ra
8for [key in products]: print["key: " + key + ", value: " + str[products[key]]]
Tương tự, bỏ qua từ khóa cuối cùng, chúng ta có thể chuyển một mục về đầu
9for [key in products]: print["key: " + key + ", value: " + str[products[key]]]
đầu ra
0shampoo: 100 banana: 12 cheese: 150
Từ điển thông thường có một phương thức popitem[] để xóa mục ở cuối bên phải của từ điển. Do đó, popitem[] làm trống từ điển theo thứ tự LIFO [Last In First Out]
Tuy nhiên, OrderedDict cho phép chuyển một từ khóa đặc biệt cuối cùng mặc định thành True. Nếu chúng ta đặt nó thành Sai, thì mục ngoài cùng bên trái trong OrderedDict sẽ xuất hiện. Do đó, thứ tự loại bỏ các mục LIFO chuyển đổi thành thứ tự FIFO [Nhập trước xuất trước]
1shampoo: 100 banana: 12 cheese: 150
đầu ra
2shampoo: 100 banana: 12 cheese: 150
Nếu chúng tôi thực hiện popitem trên một từ điển trống, chúng tôi sẽ gặp lỗi KeyError
Lựa chọn giữa OrderedDict và dict
Sau khi nghiên cứu về OrderedDict, câu hỏi tự nhiên có thể xuất hiện trong đầu bạn là khi nào chúng ta sẽ sử dụng OrderedDict thay vì Dict thông thường?
Tuy nhiên, OrderedDict duy trì thứ tự của các mục được chèn vào từ điển, đi kèm với chi phí
- OrderedDict chiếm thêm 50% bộ nhớ để lưu trữ các mục. Cần có một lớp lưu trữ bổ sung để duy trì thứ tự của các mặt hàng
- Việc lặp lại một OrderedDict tốn kém hơn 50% so với một từ điển thông thường. Điều này là do cách các mặt hàng được lưu trữ trong OrderedDict để đạt được sự đảm bảo về đơn hàng. Chúng ta cần thực hiện thêm một bước nhảy trên cấu trúc dữ liệu bổ sung được giải thích ở điểm trên
Vì vậy, nếu thứ tự của các phần tử là không bắt buộc và chúng ta cần truy cập nhanh vào các cặp [khóa, giá trị], chúng ta nên sử dụng một từ điển thông thường
Nếu chúng ta muốn thứ tự các phần tử được giữ nguyên, chẳng hạn
- Nếu chúng tôi muốn các mục được lưu trữ theo thứ tự thời gian [LIFO]
- Nếu chúng tôi muốn truy cập các mục bằng chỉ mục, chúng tôi cần biết một cách xác định vị trí của một mục. Điều này dành cho các trường hợp sử dụng khi chúng tôi muốn lưu trữ vị trí của một mục bằng cách sử dụng int chẳng hạn, làm tham chiếu đến khóa
- Nếu so sánh giữa hai từ điển có tính đến thứ tự trình tự các mục. Hai từ điển thông thường có các mục giống nhau có thể không được gọi là bằng nhau nếu thứ tự của các mục là quan trọng
Bảng dưới đây tóm tắt so sánh giữa hai loại từ điển
FeatureOrderedDictdictDuy trì thứ tự của các mụcCó KhôngĐộ phức tạp về thời gian của các thao tácCaoThấpDung lượng bộ nhớCaoThấpSo sánh chất lượng xem xét thứ tự của các mụcCóKhông