Python中如何按字典的值进行排序

Python中如何按字典的值进行排序

技术背景

在Python编程中,字典(dict)是一种非常常用的数据结构,它以键值对的形式存储数据。然而,字典本身是无序的,当我们需要根据字典的值对其进行排序时,就需要借助一些额外的方法和技巧。

实现步骤

Python 3.7+ 或 CPython 3.6

在Python 3.7及以上版本,以及CPython 3.6版本(虽然在CPython 3.6中是实现细节),字典会保留插入顺序。可以使用以下方式按值排序:

1
2
3
4
5
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
# 方法一
sorted_dict1 = {k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
# 方法二
sorted_dict2 = dict(sorted(x.items(), key=lambda item: item[1]))

旧版本Python

在旧版本Python中,字典本身无法排序,需要使用有序的数据类型(如列表)来表示排序后的结果。

1
2
3
4
5
6
import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
# 按值排序
sorted_x = sorted(x.items(), key=operator.itemgetter(1))
# 若要按键排序
sorted_by_key = sorted(x.items(), key=operator.itemgetter(0))

在Python 3中,由于不允许解包,可以使用以下方式:

1
2
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=lambda kv: kv[1])

如果需要将排序后的结果存储为有序字典,可以使用collections.OrderedDict

1
2
import collections
sorted_dict = collections.OrderedDict(sorted_x)

其他方法

使用sorted(dict1, key=dict1.get)

1
2
3
4
5
6
7
8
from collections import defaultdict
d = defaultdict(int)
text = "your text here"
for w in text.split():
d[w] += 1

for w in sorted(d, key=d.get, reverse=True):
print(w, d[w])

使用lambda函数

1
2
3
4
5
d = {'one':1,'three':3,'five':5,'two':2,'four':4}
# 升序
a = sorted(d.items(), key=lambda x: x[1])
# 降序
b = sorted(d.items(), key=lambda x: x[1], reverse=True)

使用collections.Counter

1
2
3
4
5
6
7
from collections import Counter
x = {'hello': 1, 'python': 5, 'world': 3}
c = Counter(x)
# 降序
print(c.most_common())
# 升序
print(c.most_common()[::-1])

核心代码

以下是一个综合示例,展示了多种按值排序的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import operator
from collections import OrderedDict, Counter

# 示例字典
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}

# Python 3.7+ 或 CPython 3.6
sorted_dict1 = {k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
sorted_dict2 = dict(sorted(x.items(), key=lambda item: item[1]))

# 旧版本Python
sorted_x = sorted(x.items(), key=operator.itemgetter(1))
sorted_dict = OrderedDict(sorted_x)

# 使用 sorted(dict1, key=dict1.get)
sorted_keys = sorted(x, key=x.get)

# 使用 collections.Counter
c = Counter(x)
sorted_counter_desc = c.most_common()
sorted_counter_asc = c.most_common()[::-1]

print("Python 3.7+ 方法一:", sorted_dict1)
print("Python 3.7+ 方法二:", sorted_dict2)
print("旧版本Python:", sorted_dict)
print("sorted(dict1, key=dict1.get):", sorted_keys)
print("collections.Counter 降序:", sorted_counter_desc)
print("collections.Counter 升序:", sorted_counter_asc)

最佳实践

  • 性能考虑:在处理大规模数据时,使用operator.itemgetter通常比lambda函数更高效。
  • 兼容性:如果代码需要在不同版本的Python中运行,建议使用兼容旧版本的方法。
  • 数据类型:如果字典的值是可比较的(如数字、字符串),排序方法可以正常工作;如果值是自定义对象,需要确保对象实现了__lt__等比较方法。

常见问题

字典的排序结果是字典还是列表?

在旧版本Python中,排序结果通常是列表(如列表的元组);在Python 3.7+中,可以将排序结果转换为字典。

如何按值降序排序?

sorted函数中添加reverse=True参数即可,例如:sorted(x.items(), key=lambda item: item[1], reverse=True)

键值相同的元素排序顺序如何?

排序算法是稳定的,即键值相同的元素会保持原有的相对顺序。


Python中如何按字典的值进行排序
https://119291.xyz/posts/2025-04-14.python-dictionary-sort-by-value/
作者
ww
发布于
2025年4月14日
许可协议