Bạn có thể sắp xếp một từ điển Python không?

Từ điển được sử dụng tốt nhất để tra cứu khóa-giá trị. chúng tôi cung cấp một khóa và từ điển sẽ nhanh chóng trả về giá trị tương ứng

Nhưng nếu bạn cần cả tra cứu khóa-giá trị và lặp lại thì sao?

Khi lưu ý đến thứ tự mục từ điển, bạn có thể tự hỏi làm thế nào chúng ta có thể sắp xếp một từ điển?

Từ điển được đặt hàng

Kể từ Python 3. 6 từ điển được đặt hàng [về mặt kỹ thuật là thứ tự]

Các khóa từ điển được lưu trữ theo thứ tự chèn, nghĩa là bất cứ khi nào một khóa mới được thêm vào, nó sẽ được thêm vào cuối cùng

1
2
3
4
>>> color_amounts = {"purple": 6, "green": 3, "blue": 2}
>>> color_amounts["pink"] = 4
>>> color_amounts
{'purple': 6, 'green': 3, 'blue': 2, 'pink': 4}

Nhưng nếu chúng tôi cập nhật một cặp khóa-giá trị, thì khóa vẫn giữ nguyên vị trí cũ

1
2
3
>>> color_amounts["green"] = 5
>>> color_amounts
{'purple': 6, 'green': 5, 'blue': 2, 'pink': 4}

Vì vậy, nếu bạn định điền vào từ điển một số dữ liệu cụ thể và sau đó để nguyên từ điển đó, tất cả những gì bạn cần làm là đảm bảo rằng dữ liệu gốc theo thứ tự bạn muốn

Ví dụ: nếu chúng tôi có tệp CSV viết tắt của tiểu bang Hoa Kỳ và tệp của chúng tôi được sắp xếp theo thứ tự bảng chữ cái theo tên tiểu bang, từ điển của chúng tôi sẽ được sắp xếp theo cách tương tự

1
2
3
4
5
6
7
>>> import csv
>>> state_abbreviations = {}
>>> for name, abbreviation in csv.reader["state-abbreviations.csv"]
..     state_abbreviations[name] = abbreviation
...
>>> state_abbreviations
{'Alabama': 'AL', 'Alaska': 'AK', 'Arizona': 'AZ', 'Arkansas': 'AR', 'California': 'CA', ...}

Nếu dữ liệu đầu vào của chúng tôi đã được sắp xếp chính xác, thì từ điển của chúng tôi cũng sẽ được sắp xếp theo đúng thứ tự

Cách sắp xếp từ điển theo các khóa của nó

Nếu dữ liệu của chúng tôi chưa được sắp xếp thì sao?

Giả sử chúng ta có một từ điển ánh xạ các phòng họp tới số phòng tương ứng của chúng

1
>>> rooms = {"Pink": "Rm 403", "Space": "Rm 201", "Quail": "Rm 500", "Lime": "Rm 503"}

Và chúng tôi muốn sắp xếp từ điển này theo các khóa của nó

Chúng ta có thể sử dụng phương thức

1
2
3
4
5
6
7
6 trong từ điển của mình để lấy các bộ giá trị khóa-giá trị có thể lặp lại và sau đó sử dụng hàm
1
2
3
4
5
6
7
7 để sắp xếp các bộ dữ liệu này

1
2
3
4
>>> rooms.items[]
dict_items[[['Pink', 'Rm 403'], ['Space', 'Rm 201'], ['Quail', 'Rm 500'], ['Lime', 'Rm 503']]]
>>> sorted[rooms.items[]]
[['Lime', 'Rm 503'], ['Pink', 'Rm 403'], ['Quail', 'Rm 500'], ['Space', 'Rm 201']]

Hàm

1
2
3
4
5
6
7
7 sử dụng toán tử
1
2
3
4
5
6
7
9 để so sánh nhiều mục trong một lần lặp đã cho và trả về một danh sách đã sắp xếp. Hàm
1
2
3
4
5
6
7
7 luôn trả về một danh sách

Để biến các cặp khóa-giá trị này thành một từ điển, chúng ta có thể chuyển thẳng chúng đến hàm tạo

>>> import csv
>>> state_abbreviations = {}
>>> for name, abbreviation in csv.reader["state-abbreviations.csv"]
..     state_abbreviations[name] = abbreviation
...
>>> state_abbreviations
{'Alabama': 'AL', 'Alaska': 'AK', 'Arizona': 'AZ', 'Arkansas': 'AR', 'California': 'CA', ...}
1

1
2
3
>>> color_amounts = {"purple": 6, "green": 3, "blue": 2}
>>> color_amounts["pink"] = 4
>>> color_amounts
{'purple': 6, 'green': 3, 'blue': 2, 'pink': 4}
1

Hàm tạo

>>> import csv
>>> state_abbreviations = {}
>>> for name, abbreviation in csv.reader["state-abbreviations.csv"]
..     state_abbreviations[name] = abbreviation
...
>>> state_abbreviations
{'Alabama': 'AL', 'Alaska': 'AK', 'Arizona': 'AZ', 'Arkansas': 'AR', 'California': 'CA', ...}
1 sẽ chấp nhận danh sách các bộ 2 mục [hoặc bất kỳ lần lặp nào trong số các lần lặp 2 mục] và tạo một từ điển từ đó, sử dụng mục đầu tiên từ mỗi bộ làm khóa và mục thứ hai làm giá trị tương ứng

Các cặp khóa-giá trị được sắp xếp theo từ điển… cái gì?

Chúng tôi đang sắp xếp các bộ dữ liệu của các cặp khóa-giá trị trước khi tạo từ điển từ chúng. Nhưng việc sắp xếp các bộ dữ liệu hoạt động như thế nào?

1
2
3
>>> color_amounts = {"purple": 6, "green": 3, "blue": 2}
>>> color_amounts["pink"] = 4
>>> color_amounts
{'purple': 6, 'green': 3, 'blue': 2, 'pink': 4}
3

Khi sắp xếp các bộ dữ liệu, Python sử dụng thứ tự từ điển [nghe có vẻ lạ hơn thực tế]. So sánh một tuple 2 mục về cơ bản hiểu rõ thuật toán này

>>> color_amounts = {"purple": 6, "green": 3, "blue": 2}
>>> color_amounts["pink"] = 4
>>> color_amounts
{'purple': 6, 'green': 3, 'blue': 2, 'pink': 4}
4_______1_______5

Tôi đã viết một bài báo về thứ tự bộ giải thích điều này chi tiết hơn

bạn có thể đang nghĩ. có vẻ như sắp xếp này không chỉ theo khóa mà còn theo khóa và giá trị. Và bạn đúng. Nhưng chỉ loại

Các khóa trong từ điển phải luôn được so sánh là không bằng nhau [nếu hai khóa bằng nhau, chúng được coi là cùng một khóa]. Vì vậy, miễn là các khóa có thể so sánh được với nhau bằng toán tử nhỏ hơn [

1
2
3
4
5
6
7
9], việc sắp xếp các bộ 2 mục của các cặp khóa-giá trị phải luôn được sắp xếp theo khóa

Không thể sắp xếp từ điển tại chỗ

Điều gì sẽ xảy ra nếu chúng tôi đã có các mục của mình trong một từ điển và chúng tôi muốn sắp xếp từ điển đó?

Chúng tôi không thể sắp xếp từ điển tại chỗ, nhưng chúng tôi có thể lấy các mục từ từ điển của mình, sắp xếp các mục đó bằng kỹ thuật tương tự mà chúng tôi đã sử dụng trước đây, sau đó biến các mục đó thành một từ điển mới

1
2
3
4
>>> color_amounts = {"purple": 6, "green": 3, "blue": 2}
>>> color_amounts["pink"] = 4
>>> color_amounts
{'purple': 6, 'green': 3, 'blue': 2, 'pink': 4}
7

Điều đó tạo ra một đối tượng từ điển mới. Nếu chúng tôi thực sự muốn cập nhật đối tượng từ điển ban đầu của mình, chúng tôi có thể lấy các mục từ từ điển, sắp xếp chúng, xóa từ điển của tất cả các mục của nó, sau đó thêm tất cả các mục trở lại từ điển

1
2
3
4
>>> color_amounts = {"purple": 6, "green": 3, "blue": 2}
>>> color_amounts["pink"] = 4
>>> color_amounts
{'purple': 6, 'green': 3, 'blue': 2, 'pink': 4}
9

Nhưng tại sao phải bận tâm? . chúng ta có xu hướng thích tạo cấu trúc dữ liệu mới hơn là sử dụng lại cấu trúc dữ liệu cũ [sở thích này một phần là do cách các biến hoạt động trong Python]

Cách sắp xếp từ điển theo giá trị của nó

Điều gì sẽ xảy ra nếu chúng ta muốn sắp xếp một từ điển theo các giá trị của nó thay vì các khóa của nó?

Chúng ta có thể tạo một danh sách mới gồm các bộ khóa-giá trị [thực ra là một trình tạo trong trường hợp của chúng tôi bên dưới], sắp xếp danh sách đó, sau đó lật chúng trở lại các bộ khóa-giá trị và tạo lại từ điển của chúng ta

1
2
3
0
1
2
3
1

Cái này dùng được nhưng hơi lâu. Ngoài ra, kỹ thuật này thực sự sắp xếp cả giá trị và khóa của chúng tôi [ưu tiên giá trị trong sắp xếp]

Điều gì sẽ xảy ra nếu chúng ta chỉ muốn sắp xếp từ điển của mình theo các giá trị của nó, bỏ qua hoàn toàn nội dung của các khóa?

1
2
3
0
1
2
3
3

Hàm khóa mà chúng tôi chuyển đến đã sắp xếp sẽ chấp nhận một mục từ khả năng lặp lại mà chúng tôi đang sắp xếp và trả về khóa để sắp xếp theo. Lưu ý rằng từ “chìa khóa” ở đây không liên quan đến các khóa từ điển. Các khóa từ điển được sử dụng để tra cứu các giá trị từ điển trong khi chức năng khóa này trả về một đối tượng xác định cách sắp xếp các mục trong một lần lặp

Nếu chúng ta muốn sắp xếp từ điển theo các giá trị của nó, chúng ta có thể tạo một hàm chính chấp nhận từng mục trong danh sách bộ 2 mục của chúng ta và chỉ trả về giá trị

1
2
3
4
1
2
3
5

Sau đó, chúng tôi sẽ sử dụng chức năng chính của mình bằng cách chuyển nó tới chức năng

1
2
3
4
5
6
7
7 [vâng, chức năng này có thể được chuyển cho các chức năng khác trong Python] và chuyển kết quả tới
>>> import csv
>>> state_abbreviations = {}
>>> for name, abbreviation in csv.reader["state-abbreviations.csv"]
..     state_abbreviations[name] = abbreviation
...
>>> state_abbreviations
{'Alabama': 'AL', 'Alaska': 'AK', 'Arizona': 'AZ', 'Arkansas': 'AR', 'California': 'CA', ...}
1 để tạo một từ điển mới

1
2
3
1
2
3
7

Nếu bạn không muốn tạo chức năng phím tùy chỉnh chỉ để sử dụng nó một lần, bạn có thể sử dụng chức năng lambda [mà tôi không thường khuyên dùng]

1
2
3
1
2
3
9

Hoặc bạn có thể sử dụng

>>> import csv
>>> state_abbreviations = {}
>>> for name, abbreviation in csv.reader["state-abbreviations.csv"]
..     state_abbreviations[name] = abbreviation
...
>>> state_abbreviations
{'Alabama': 'AL', 'Alaska': 'AK', 'Arizona': 'AZ', 'Arkansas': 'AR', 'California': 'CA', ...}
9 để tạo một hàm chính nhận mục thứ hai từ mỗi bộ giá trị khóa

1
2
3
4
>>> color_amounts["green"] = 5
>>> color_amounts
{'purple': 6, 'green': 5, 'blue': 2, 'pink': 4}
1

Tôi đã thảo luận về sở thích của mình cho

1
0

Đặt hàng một từ điển theo một số cách khác

Điều gì sẽ xảy ra nếu chúng ta cần sắp xếp từ điển của mình theo thứ gì đó không chỉ là khóa hoặc giá trị?

1
2
3
0
>>> color_amounts["green"] = 5
>>> color_amounts
{'purple': 6, 'green': 5, 'blue': 2, 'pink': 4}
3

Nếu chúng tôi sắp xếp các phòng này theo giá trị, thì các chuỗi đó sẽ không được sắp xếp theo cách số mà chúng tôi hy vọng

1
2
3
4
>>> color_amounts["green"] = 5
>>> color_amounts
{'purple': 6, 'green': 5, 'blue': 2, 'pink': 4}
5

Rm 30 nên là đầu tiên và Rm 2000 nên là cuối cùng. Nhưng chúng tôi đang sắp xếp các chuỗi, được sắp xếp theo từng ký tự dựa trên giá trị unicode của từng ký tự [tôi trong bài viết của mình về thứ tự bộ]

Thay vào đó, chúng tôi có thể tùy chỉnh hàm

>>> import csv
>>> state_abbreviations = {}
>>> for name, abbreviation in csv.reader["state-abbreviations.csv"]
..     state_abbreviations[name] = abbreviation
...
>>> state_abbreviations
{'Alabama': 'AL', 'Alaska': 'AK', 'Arizona': 'AZ', 'Arkansas': 'AR', 'California': 'CA', ...}
6 mà chúng tôi đang sử dụng để sắp xếp theo số

>>> color_amounts["green"] = 5
>>> color_amounts
{'purple': 6, 'green': 5, 'blue': 2, 'pink': 4}
6
>>> color_amounts["green"] = 5
>>> color_amounts
{'purple': 6, 'green': 5, 'blue': 2, 'pink': 4}
7

Khi chúng tôi sử dụng chức năng chính này để sắp xếp từ điển của chúng tôi

1
>>> color_amounts["green"] = 5
>>> color_amounts
{'purple': 6, 'green': 5, 'blue': 2, 'pink': 4}
9

Nó sẽ được sắp xếp theo số phòng nguyên, như mong đợi

1
2
3
4
5
6
7
0_______4_______1

Bạn có nên sắp xếp một từ điển?

Khi bạn chuẩn bị sắp xếp một cuốn từ điển, trước tiên hãy tự hỏi bản thân “tôi có cần làm việc này không”?

Từ điển được sử dụng để tra cứu khóa-giá trị. bạn có thể nhanh chóng nhận được một giá trị cho một khóa. Chúng rất nhanh trong việc truy xuất các giá trị cho các khóa. Nhưng từ điển chiếm nhiều không gian hơn một danh sách các bộ dữ liệu

Nếu bạn có thể thoát khỏi việc sử dụng danh sách các bộ dữ liệu trong mã của mình [vì bạn thực sự không cần tra cứu khóa-giá trị], có lẽ bạn nên sử dụng danh sách các bộ dữ liệu thay vì từ điển

Nhưng nếu tra cứu chính là những gì bạn cần, thì không chắc là bạn cũng cần lặp lại từ điển của mình

Bây giờ chắc chắn rằng ngay bây giờ bạn thực sự có một trường hợp sử dụng tốt để sắp xếp từ điển [ví dụ: có thể bạn đang sắp xếp các khóa trong từ điển các thuộc tính], nhưng hãy nhớ rằng bạn sẽ cần sắp xếp từ điển rất nhiều.

Tóm lược

Từ điển được sử dụng để tra cứu nhanh một giá trị dựa trên khóa. Thứ tự của các mục trong từ điển hiếm khi quan trọng

Trong trường hợp hiếm hoi mà bạn quan tâm đến thứ tự các mục trong từ điển của mình, hãy nhớ rằng từ điển được sắp xếp theo thứ tự chèn khóa của chúng [kể từ Python 3. 6]. Vì vậy, các khóa trong từ điển của bạn sẽ giữ nguyên thứ tự chúng được thêm vào từ điển

Nếu bạn muốn sắp xếp một từ điển theo các khóa của nó, bạn có thể sử dụng hàm

1
2
3
4
5
6
7
7 tích hợp cùng với hàm tạo
>>> import csv
>>> state_abbreviations = {}
>>> for name, abbreviation in csv.reader["state-abbreviations.csv"]
..     state_abbreviations[name] = abbreviation
...
>>> state_abbreviations
{'Alabama': 'AL', 'Alaska': 'AK', 'Arizona': 'AZ', 'Arkansas': 'AR', 'California': 'CA', ...}
1

1
1
2
3
4
5
6
7
3

Nếu bạn muốn sắp xếp một từ điển theo các giá trị của nó, bạn có thể chuyển một hàm

>>> import csv
>>> state_abbreviations = {}
>>> for name, abbreviation in csv.reader["state-abbreviations.csv"]
..     state_abbreviations[name] = abbreviation
...
>>> state_abbreviations
{'Alabama': 'AL', 'Alaska': 'AK', 'Arizona': 'AZ', 'Arkansas': 'AR', 'California': 'CA', ...}
6 tùy chỉnh [một hàm trả về giá trị cho từng mục] cho
1
2
3
4
5
6
7
7

>>> color_amounts["green"] = 5
>>> color_amounts
{'purple': 6, 'green': 5, 'blue': 2, 'pink': 4}
6
1
2
3
4
5
6
7
5

Nhưng hãy nhớ rằng, chúng ta thường không quan tâm đến thứ tự của từ điển. Bất cứ khi nào bạn sắp xếp một từ điển, hãy nhớ tự hỏi mình có thực sự cần sắp xếp cấu trúc dữ liệu này không và liệu một danh sách các bộ dữ liệu có phù hợp hơn một từ điển ở đây không?

Tại sao chúng tôi không thể sắp xếp từ điển trong Python?

Khái niệm sắp xếp chỉ áp dụng cho một tập hợp có thứ tự—nói cách khác, một chuỗi. Một ánh xạ, chẳng hạn như từ điển, không có thứ tự nên không thể sắp xếp.

Là sắp xếp một từ điển có thể?

Không thể sắp xếp từ điển , chỉ nhận được biểu diễn của từ điển được sắp xếp. Từ điển vốn đã không có thứ tự, nhưng các loại khác, chẳng hạn như danh sách và bộ dữ liệu, thì không. Vì vậy, bạn cần một kiểu dữ liệu được sắp xếp để biểu thị các giá trị được sắp xếp, đây sẽ là một danh sách—có thể là một danh sách các bộ.

Bạn có thể sắp xếp từ điển theo khóa Python không?

Hàm sorted[] của Python có thể được sử dụng để sắp xếp từ điển theo khóa , cho phép phương pháp sắp xếp tùy chỉnh. sorted[] nhận ba đối số. đối tượng, khóa và đảo ngược. Từ điển là cấu trúc dữ liệu không có thứ tự. Họ sử dụng cấu trúc ánh xạ để lưu trữ dữ liệu.

Bạn có thể sắp xếp từ điển theo thứ tự abc trong Python không?

Cần sắp xếp trong từ điển . sort the keys alphabetically using key_value. hàm iterkeys[] . Thứ hai, sắp xếp các khóa theo thứ tự bảng chữ cái bằng hàm đã sắp xếp [giá trị khóa] và in giá trị tương ứng với nó. Thứ ba, sắp xếp các giá trị theo thứ tự abc bằng key_value.

Chủ Đề