Từ điển Python di chuyển đến cuối

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

for [key in products]:
    print["key: " + key + ", value: " + str[products[key]]]
0

for [key in products]:
    print["key: " + key + ", value: " + str[products[key]]]
1

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

for [key in products]:
    print["key: " + key + ", value: " + str[products[key]]]
2

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

for [key in products]:
    print["key: " + key + ", value: " + str[products[key]]]
3

đầu ra

for [key in products]:
    print["key: " + key + ", value: " + str[products[key]]]
4

Trong tất cả các trường hợp trên, đầu ra là như nhau

for [key in products]:
    print["key: " + key + ", value: " + str[products[key]]]
5

đầ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

for [key in products]:
    print["key: " + key + ", value: " + str[products[key]]]
6

Ví dụ

for [key in products]:
    print["key: " + key + ", value: " + str[products[key]]]
7

đầu ra

for [key in products]:
    print["key: " + key + ", value: " + str[products[key]]]
8

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

for [key in products]:
    print["key: " + key + ", value: " + str[products[key]]]
9

đầu ra

shampoo: 100
banana: 12
cheese: 150
0

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]

shampoo: 100
banana: 12
cheese: 150
1

đầu ra

shampoo: 100
banana: 12
cheese: 150
2

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

Chủ Đề