Cách sắp xếp từ điển theo giá trị trong Python

Giới thiệu

Từ điển trong Python là một tập hợp các mục lưu trữ dữ liệu dưới dạng các cặp khóa-giá trị. Trong Python 3.7 và các phiên bản mới hơn, từ điển được sắp xếp theo thứ tự chèn mục. Trong các phiên bản trước đó, chúng không có thứ tự.

Trong bài viết này, chúng ta sẽ xem xét cách chúng ta có thể sắp xếp một từ điển dựa trên các giá trị mà chúng chứa.

Sắp xếp từ điển bằng cách sử dụng cho Vòng lặp

Chúng tôi có thể sắp xếp từ điển với sự trợ giúp của for vòng. Đầu tiên, chúng tôi sử dụng sorted() chức năng sắp xếp thứ tự các giá trị của từ điển. Sau đó, chúng tôi lặp lại các giá trị đã được sắp xếp, tìm các khóa cho mỗi giá trị. Chúng tôi thêm các cặp khóa-giá trị này theo thứ tự đã sắp xếp vào một từ điển mới.

Lưu ý: Sắp xếp không cho phép bạn sắp xếp lại từ điển tại chỗ. Chúng tôi đang viết các cặp có thứ tự trong một từ điển hoàn toàn mới, trống rỗng.

dict1 = {1: 1, 2: 9, 3: 4}
sorted_values = sorted(dict1.values()) 
sorted_dict = {}

for i in sorted_values:
    for k in dict1.keys():
        if dict1[k] == i:
            sorted_dict[k] = dict1[k]

print(sorted_dict)

Nếu bạn chạy điều này với trình thông dịch Python, bạn sẽ thấy:

{1: 1, 3: 4, 2: 9}

Bây giờ chúng ta đã thấy cách sắp xếp bằng các vòng lặp, hãy xem xét một giải pháp thay thế phổ biến hơn sử dụng sorted() chức năng.

Sắp xếp từ điển bằng cách sử dụng đã sắp xếp () Chức năng

Trước đây chúng tôi đã sử dụng sorted() hàm để sắp xếp các giá trị của một mảng. Khi sắp xếp từ điển, chúng ta có thể chuyển thêm một đối số vào sorted() chức năng như thế này: sorted(dict1, key=dict1.get).

Ở đây, key là một hàm được gọi trên mỗi phần tử trước khi các giá trị được so sánh để sắp xếp. Các get() phương thức trên các đối tượng từ điển trả về giá trị của khóa của từ điển.

Sản phẩm sorted(dict1, key=dict1.get) biểu thức sẽ trả về danh sách các khóa có giá trị được sắp xếp theo thứ tự. Từ đó, chúng ta có thể tạo một từ điển mới, được sắp xếp:

dict1 = {1: 1, 2: 9, 3: 4}
sorted_dict = {}
sorted_keys = sorted(dict1, key=dict1.get)  

for w in sorted_keys:
    sorted_dict[w] = dict1[w]

print(sorted_dict) 

Sử dụng sorted() hàm đã giảm số lượng mã chúng tôi phải viết khi sử dụng for các vòng lặp. Tuy nhiên, chúng ta có thể kết hợp thêm sorted() chức năng với itemgetter() chức năng cho một giải pháp ngắn gọn hơn để sắp xếp các từ điển theo các giá trị.

Sắp xếp từ điển bằng cách sử dụng nhà điều hành Mô-đun và itemgetter ()

Sản phẩm operator mô-đun bao gồm itemgetter() hàm số. Hàm này trả về một đối tượng có thể gọi trả về một mục từ một đối tượng.

Ví dụ, hãy sử dụng itemgetter() để tạo một đối tượng có thể gọi trả về giá trị của bất kỳ từ điển nào có khóa 2:

import operator

dict1 = {1: 1, 2: 9}
get_item_with_key_2 = operator.itemgetter(2)

print(get_item_with_key_2(dict1))  

Mọi từ điển đều có quyền truy cập vào items() phương pháp. Hàm này trả về các cặp khóa-giá trị của từ điển dưới dạng danh sách các bộ giá trị. Chúng ta có thể sắp xếp danh sách các bộ giá trị bằng cách sử dụng itemgetter() hàm để kéo giá trị thứ hai của tuple tức là giá trị của các khóa trong từ điển.

Sau khi được sắp xếp, chúng tôi có thể tạo từ điển dựa trên các giá trị đó:

import operator

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict) 

Với ít nỗ lực hơn, chúng tôi có một từ điển được sắp xếp theo các giá trị!

như key đối số chấp nhận bất kỳ hàm nào, chúng ta có thể sử dụng các hàm lambda để trả về các giá trị từ điển để chúng có thể được sắp xếp. Hãy xem làm thế nào.

Sắp xếp từ điển bằng hàm Lambda

Các hàm Lambda là các hàm ẩn danh hoặc không tên trong Python. Chúng ta có thể sử dụng các hàm lambda để lấy giá trị của một mục từ điển mà không cần phải nhập operator mô-đun cho itemgetter(). Nếu bạn muốn tìm hiểu thêm về lambdas, bạn có thể đọc về chúng trong hướng dẫn của chúng tôi để Các hàm Lambda trong Python.

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Hãy sắp xếp một từ điển theo các giá trị bằng cách sử dụng hàm lambda trong key lập luận của sorted():

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=lambda item: item[1])
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict)  

Lưu ý rằng các phương pháp chúng ta đã thảo luận cho đến nay chỉ hoạt động với Python 3.7 trở lên. Hãy xem những gì chúng ta có thể làm cho các phiên bản Python trước.

Trả lại từ điển mới với các giá trị được sắp xếp

Sau khi sắp xếp từ điển theo các giá trị, để giữ một từ điển được sắp xếp trong các phiên bản Python trước 3.7, bạn phải sử dụng OrderedDict - có sẵn trong collections mô-đun. Các đối tượng này là từ điển giữ thứ tự chèn.

Đây là một ví dụ về sắp xếp và sử dụng OrderedDict:

import operator
from collections import OrderedDict

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  

sorted_dict = OrderedDict()
for k, v in sorted_tuples:
    sorted_dict[k] = v

print(sorted_dict)  

Kết luận

Hướng dẫn này cho thấy cách sắp xếp một từ điển dựa trên các giá trị của nó. Đầu tiên, chúng tôi sắp xếp một từ điển bằng cách sử dụng hai vòng lặp for. Sau đó, chúng tôi đã cải thiện việc sắp xếp của mình bằng cách sử dụng sorted() hàm số. Chúng tôi cũng đã thấy itemgetter() chức năng từ operator mô-đun có thể làm cho giải pháp của chúng tôi ngắn gọn hơn.

Cuối cùng, chúng tôi đã điều chỉnh giải pháp của mình để hoạt động trên các phiên bản Python thấp hơn 3.7.

Các biến thể của sorted() là chức năng phổ biến và đáng tin cậy nhất để sắp xếp từ điển theo các giá trị.

Dấu thời gian:

Thêm từ xếp chồng lên nhau