Trong Python, từ điển là một cấu trúc béo không có thứ tự theo mặc định. Vì vậy, đôi khi, bạn sẽ muốn sắp xếp từ điển theo khóa hoặc giá trị để thực hiện các truy vấn dễ dàng hơn.
Vấn đề là việc sắp xếp một từ điển theo giá trị không bao giờ là một việc đơn giản. Đó là bởi vì Python không có phương thức sẵn có để làm điều đó.
Tuy nhiên, tôi đã tìm ra cách sắp xếp từ điển theo giá trị và đó là điều tôi sẽ chỉ cho bạn cách thực hiện trong bài viết này.
Những gì chúng tôi sẽ bao gồm
Cách sắp xếp dữ liệu với sorted()
Phương pháp
Các sorted()
phương thức sắp xếp dữ liệu có thể lặp lại như danh sách, bộ dữ liệu và từ điển. Nhưng nó chỉ sắp xếp theo khóa.
Các sorted()
phương pháp đặt các mục được sắp xếp trong một danh sách. Đó là một vấn đề khác mà chúng tôi phải giải quyết, bởi vì chúng tôi muốn từ điển được sắp xếp vẫn là từ điển.
Ví dụ, sorted()
sắp xếp danh sách dưới đây theo thứ tự bảng chữ cái:
persons = ['Chris', 'Amber', 'David', 'El-dorado', 'Brad', 'Folake']
sortedPersons = sorted(persons)
print(sortedPersons)
# Output: ['Amber', 'Brad', 'Chris', 'David', 'El-dorado', 'Folake']
Và sorted()
phương thức sắp xếp các số trong bộ bên dưới theo thứ tự tăng dần:
numbers = (14, 3, 1, 4, 2, 9, 8, 10, 13, 12)
sortedNumbers = sorted(numbers)
print(sortedNumbers)
# Output: [1, 2, 3, 4, 8, 9, 10, 12, 13, 14]
Nếu bạn sử dụng sorted()
với một từ điển, chỉ các khóa sẽ được trả về và như thường lệ, nó sẽ nằm trong một danh sách:
my_dict = { 'num6': 6, 'num3': 3, 'num2': 2, 'num4': 4, 'num1': 1, 'num5': 5}
sortedDict = sorted(my_dict)
print(sortedDict)
# ['num1', 'num2', 'num3', 'num4', 'num5', 'num6']
Đây không phải là hành vi bạn muốn. Bạn muốn từ điển được sắp xếp theo giá trị và vẫn là từ điển. Đó là những gì tôi sẽ cho bạn thấy tiếp theo.
Như thế nào sorted()
phương pháp hoạt động
Để sắp xếp một từ điển, chúng ta vẫn sẽ sử dụng chức năng đã sắp xếp, nhưng theo một cách phức tạp hơn. Đừng lo lắng, tôi sẽ giải thích mọi thứ bạn cần biết.
Vì chúng ta vẫn sẽ sử dụng sorted()
phương pháp, sau đó là thời gian để giải thích sorted()
phương pháp một cách chi tiết.
các thông số của sorted()
Phương pháp
Các sorted()
phương thức có thể chấp nhận tối đa 3 tham số:
-
iterable – dữ liệu để lặp lại. Nó có thể là một bộ dữ liệu, danh sách hoặc từ điển.
-
key – một giá trị tùy chọn, chức năng giúp bạn thực hiện thao tác sắp xếp tùy chỉnh.
-
đảo ngược – một giá trị tùy chọn khác. Nó giúp bạn sắp xếp dữ liệu đã được sắp xếp theo thứ tự tăng dần hoặc giảm dần
Nếu bạn đoán đúng, tham số chính là những gì chúng ta sẽ chuyển vào sorted()
phương pháp để lấy từ điển được sắp xếp theo giá trị.
Bây giờ, đã đến lúc sắp xếp từ điển của chúng ta theo giá trị và đảm bảo rằng nó vẫn là một từ điển.
Làm thế nào để sắp xếp một từ điển với sorted()
Phương pháp
Để sắp xếp chính xác một từ điển theo giá trị với sorted()
phương pháp, bạn sẽ phải làm như sau:
- chuyển từ điển cho
sorted()
phương thức làm giá trị đầu tiên - sử dụng
items()
phương pháp trên từ điển để lấy các khóa và giá trị của nó - viết hàm lambda để lấy các giá trị được truy xuất bằng
item()
phương pháp
Đây là một ví dụ:
footballers_goals = {'Eusebio': 120, 'Cruyff': 104, 'Pele': 150, 'Ronaldo': 132, 'Messi': 125}
sorted_footballers_by_goals = sorted(footballers_goals.items(), key=lambda x:x[1])
print(sorted_footballers_by_goals)
Như tôi đã nói trước đó, chúng ta phải lấy các giá trị đó của từ điển để có thể sắp xếp từ điển theo giá trị. Đó là lý do tại sao bạn có thể thấy 1 trong hàm lambda.
1 đại diện cho các chỉ số của các giá trị. Các phím là 0. Hãy nhớ rằng một lập trình viên bắt đầu đếm từ 0, không phải 1.
Với đoạn mã trên, tôi nhận được kết quả bên dưới:
# [('Cruyff', 104), ('Eusebio', 120), ('Messi', 125), ('Ronaldo', 132), ('Pele', 150)]
Đây là mã đầy đủ để bạn không bị nhầm lẫn:
footballers_goals = {'Eusebio': 120, 'Cruyff': 104, 'Pele': 150, 'Ronaldo': 132, 'Messi': 125}
sorted_footballers_by_goals = sorted(footballers_goals.items(), key=lambda x:x[1])
print(sorted_footballers_by_goals)
# [('Cruyff', 104), ('Eusebio', 120), ('Messi', 125), ('Ronaldo', 132), ('Pele', 150)]
Bạn có thể thấy từ điển đã được sắp xếp theo các giá trị theo thứ tự tăng dần. Bạn cũng có thể sắp xếp nó theo thứ tự giảm dần. Nhưng chúng tôi sẽ xem xét điều đó sau vì chúng tôi vẫn gặp vấn đề với kết quả mà chúng tôi nhận được.
Vấn đề là từ điển không còn là từ điển nữa. Các khóa và giá trị riêng lẻ được đặt trong một bộ và tiếp tục được cô đọng thành một danh sách. Hãy nhớ rằng bất cứ điều gì bạn nhận được như là kết quả của sorted()
phương pháp được đặt trong một danh sách.
Chúng tôi đã có thể sắp xếp các mục trong từ điển theo giá trị. Những gì còn lại là chuyển đổi nó trở lại từ điển.
Cách chuyển đổi danh sách kết quả thành từ điển
Để chuyển đổi danh sách kết quả thành từ điển, bạn không cần phải viết một hàm phức tạp khác hoặc một vòng lặp. Bạn chỉ cần chuyển biến lưu danh sách kết quả vào dict()
phương pháp.
converted_dict = dict(sorted_footballers_by_goals)
print(converted_dict)
# Output: {'Cruyff': 104, 'Eusebio': 120, 'Messi': 125, 'Ronaldo': 132, 'Pele': 150}
Hãy nhớ rằng chúng tôi đã lưu từ điển đã sắp xếp trong biến có tên sorted_footballers_by_goals
vì vậy đó là biến chúng ta phải chuyển đến dict()
.
Mã đầy đủ trông như thế này:
footballers_goals = {'Eusebio': 120, 'Cruyff': 104, 'Pele': 150, 'Ronaldo': 132, 'Messi': 125}
sorted_footballers_by_goals = sorted(footballers_goals.items(), key=lambda x:x[1])
converted_dict = dict(sorted_footballers_by_goals)
print(converted_dict)
# Output: {'Cruyff': 104, 'Eusebio': 120, 'Messi': 125, 'Ronaldo': 132, 'Pele': 150}
Đó là nó! Chúng tôi đã có thể sắp xếp các mục trong từ điển và chuyển đổi chúng trở lại từ điển. Chúng tôi vừa ăn bánh và cũng ăn nó!
Cách sắp xếp từ điển theo giá trị theo thứ tự tăng dần hoặc giảm dần
Nhớ cái gì đó sorted()
phương pháp chấp nhận một giá trị thứ ba gọi là reverse
.
reverse
với một giá trị của True
sẽ sắp xếp từ điển đã sắp xếp theo thứ tự giảm dần.
footballers_goals = {'Eusebio': 120, 'Cruyff': 104, 'Pele': 150, 'Ronaldo': 132, 'Messi': 125}
sorted_footballers_by_goals = sorted(footballers_goals.items(), key=lambda x:x[1], reverse=True)
converted_dict = dict(sorted_footballers_by_goals)
print(converted_dict)
# Output: {'Pele': 150, 'Ronaldo': 132, 'Messi': 125, 'Eusebio': 120, 'Cruyff': 104}
Bạn có thể thấy đầu ra bị đảo ngược vì chúng tôi đã thông qua reverse=True
đến sorted()
phương pháp.
Nếu bạn không đặt reverse
at all hoặc bạn đặt giá trị của nó thành false, từ điển sẽ được sắp xếp theo thứ tự tăng dần. Đó là mặc định.
Phần kết luận
Xin chúc mừng. Giờ đây, bạn có thể sắp xếp từ điển theo giá trị mặc dù không có phương thức hoặc hàm tích hợp sẵn để sử dụng trong Python.
Tuy nhiên, có một điều khiến tôi tò mò khi chuẩn bị viết bài này. Hãy nhớ rằng chúng tôi đã có thể sử dụng sorted()
trực tiếp trên từ điển. Kết quả là chúng tôi có một danh sách, mặc dù chúng tôi chỉ nhận được khóa chứ không phải giá trị.
Điều gì sẽ xảy ra nếu chúng ta chuyển đổi danh sách đó thành một từ điển với dict()
phương pháp? Bạn có nghĩ rằng chúng ta có thể nhận được kết quả mong muốn? Hãy xem nào:
my_dict = { 'num6': 6, 'num3': 3, 'num2': 2, 'num4': 4, 'num1': 1, 'num5': 5}
sortedDict = sorted(my_dict)
converted_dict = dict(sortedDict)
print(converted_dict)
"""
Output:
dict_by_value.py
Traceback (most recent call last):
File "sort_dict_by_value.py", line 17, in <module>
converted_dict = dict(sortedDict)
ValueError: dictionary update sequence element #0 has length 4; 2 is required
"""
Chúng tôi gặp lỗi! Đó là bởi vì nếu bạn muốn tạo một từ điển từ một danh sách, bạn phải sử dụng khả năng hiểu từ điển. Và nếu bạn sử dụng khả năng hiểu từ điển cho loại dữ liệu này, bạn phải chỉ định một giá trị cho tất cả các mục nhập. Điều đó sẽ thách thức mục đích sắp xếp từ điển theo giá trị, vì vậy đó không phải là điều chúng tôi muốn.
Nếu bạn muốn tìm hiểu thêm về cách hiểu từ điển, bạn nên đọc bài viết này.
Cảm ơn bạn đã đọc!