Python中如何按字典的值对字典列表进行排序?

Python中如何按字典的值对字典列表进行排序?

技术背景

在Python开发中,经常会遇到需要对字典列表进行排序的场景。例如,对存储用户信息的字典列表按照年龄或姓名排序。Python提供了多种方法来实现这一需求。

实现步骤

1. 使用sorted()函数和lambda表达式

1
2
list_to_be_sorted = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
newlist = sorted(list_to_be_sorted, key=lambda d: d['name'])

2. 使用operator.itemgetter

1
2
3
from operator import itemgetter
list_to_be_sorted = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
newlist = sorted(list_to_be_sorted, key=itemgetter('name'))

3. 降序排序

1
2
3
from operator import itemgetter
list_to_be_sorted = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
newlist = sorted(list_to_be_sorted, key=itemgetter('name'), reverse=True)

4. 对原列表进行排序

1
2
3
import operator
list_of_dicts = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
list_of_dicts.sort(key=operator.itemgetter('name'))

5. 按多个键排序

1
2
my_list = [{'name': 'Homer', 'age': 39}, {'name': 'Milhouse', 'age': 10}, {'name': 'Bart', 'age': 10}]
sortedlist = sorted(my_list, key=lambda elem: "%02d %s" % (elem['age'], elem['name']))

6. 不区分大小写排序

1
2
3
4
5
6
simpsons = [
{"name": "Homer", "age": 39},
{"name": "Bart", "age": 10},
{"name": "abby", "age": 9},
]
sorted_simpsons = sorted(simpsons, key=lambda k: k["name"].lower())

7. 使用Schwartzian变换

1
2
3
4
5
py = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
sort_on = "name"
decorated = [(dict_[sort_on], dict_) for dict_ in py]
decorated.sort()
result = [dict_ for (key, dict_) in decorated]

8. 使用Pandas包

1
2
3
4
5
import pandas as pd
listOfDicts = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
df = pd.DataFrame(listOfDicts)
df = df.sort_values('name')
sorted_listOfDicts = df.T.to_dict().values()

核心代码

以下是一个完整的示例,展示了多种排序方法:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from operator import itemgetter
import pandas as pd

# 示例列表
my_list = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}, {'name': 'Milhouse', 'age': 10}]

# 使用lambda表达式排序
sorted_list1 = sorted(my_list, key=lambda d: d['name'])
print("使用lambda表达式排序:", sorted_list1)

# 使用itemgetter排序
sorted_list2 = sorted(my_list, key=itemgetter('name'))
print("使用itemgetter排序:", sorted_list2)

# 降序排序
sorted_list3 = sorted(my_list, key=itemgetter('name'), reverse=True)
print("降序排序:", sorted_list3)

# 对原列表进行排序
my_list.sort(key=itemgetter('name'))
print("对原列表进行排序:", my_list)

# 按多个键排序
sorted_list4 = sorted(my_list, key=lambda k: (k['age'], k['name']))
print("按多个键排序:", sorted_list4)

# 不区分大小写排序
simpsons = [
{"name": "Homer", "age": 39},
{"name": "Bart", "age": 10},
{"name": "abby", "age": 9},
]
sorted_simpsons = sorted(simpsons, key=lambda k: k["name"].lower())
print("不区分大小写排序:", sorted_simpsons)

# 使用Schwartzian变换
sort_on = "name"
decorated = [(dict_[sort_on], dict_) for dict_ in my_list]
decorated.sort()
result = [dict_ for (key, dict_) in decorated]
print("使用Schwartzian变换:", result)

# 使用Pandas包
df = pd.DataFrame(my_list)
df = df.sort_values('name')
sorted_list5 = df.T.to_dict().values()
print("使用Pandas包:", list(sorted_list5))

最佳实践

  • 当性能是关键因素时,优先使用operator.itemgetter,因为它比lambda表达式更快。
  • 如果需要处理键缺失的情况,可以使用dict.get()方法来避免KeyError
1
2
lst = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}, {'name': 'Lisa'}]
sorted(lst, key=lambda d: d.get('age', float('inf')))

常见问题

1. KeyError

当使用lambda表达式或itemgetter时,如果字典中不存在指定的键,会抛出KeyError。可以使用dict.get()方法来避免这个问题。

2. 性能问题

Pandas包在处理大规模数据时性能较差,对于小型数据集可以使用,但对于大型数据集,建议使用sorted()函数或list.sort()方法。

3. 大小写敏感问题

如果需要不区分大小写排序,需要在key函数中使用lower()upper()方法。


Python中如何按字典的值对字典列表进行排序?
https://119291.xyz/posts/2025-05-13.how-to-sort-a-list-of-dictionaries-by-a-value-of-the-dictionary-in-python/
作者
ww
发布于
2025年5月13日
许可协议