对字典按值进行“排序”:sorted()、items()及lambda函数联合使用
对字典按值排序的核心是利用 sorted()
函数,结合字典的 items()
方法(获取键值对)和 key
参数(指定按值排序)。以下通过两个具体场景举例说明:
场景1:统计商品销量并按销量排序
假设我们有一个记录商品销量的字典,需要按销量从高到低(降序)或从低到高(升序)排列。
# 定义商品销量字典:键是商品名,值是销量
product_sales = {"苹果": 150,"香蕉": 200,"橙子": 120,"葡萄": 180
}# 1. 按销量降序排序(从高到低)
sorted_by_sales_desc = sorted(product_sales.items(), # 转换为键值对元组列表:[("苹果", 150), ("香蕉", 200), ...]key=lambda x: x[1], # 按元组的第二个元素(销量)排序reverse=True # 降序(默认是False,升序)
)# 2. 按销量升序排序(从低到高)
sorted_by_sales_asc = sorted(product_sales.items(),key=lambda x: x[1], # 同样按销量排序reverse=False # 升序(可省略,默认就是False)
)print("按销量降序:", sorted_by_sales_desc)
print("按销量升序:", sorted_by_sales_asc)
输出结果:
按销量降序:[('香蕉', 200), ('葡萄', 180), ('苹果', 150), ('橙子', 120)]
按销量升序:[('橙子', 120), ('苹果', 150), ('葡萄', 180), ('香蕉', 200)]
场景2:统计用户活跃度并按次数排序
假设我们有一个记录用户登录次数的字典,需要按登录次数排序,找出最活跃和最不活跃的用户。
# 定义用户登录次数字典:键是用户名,值是登录次数
user_activity = {"user1": 8,"user2": 3,"user3": 12,"user4": 5,"user5": 12 # 与user3登录次数相同
}# 按登录次数降序排序(次数相同则按原始顺序排列)
sorted_users = sorted(user_activity.items(),key=lambda x: x[1],reverse=True
)print("按登录次数降序:", sorted_users)
# 输出:[('user3', 12), ('user5', 12), ('user1', 8), ('user4', 5), ('user2', 3)]# 提取最活跃的用户(前两名)
most_active = sorted_users[:2]
print("最活跃的用户:", most_active) # 输出:[('user3', 12), ('user5', 12)]
说明
items()
方法:将字典{key: value}
转换为[(key1, value1), (key2, value2), ...]
的元组列表,这是排序的前提(sorted()
需接收可迭代对象)。key=lambda x: x[1]
:x
代表列表中的每个元组(key, value)
,x[1]
表示按元组的第二个元素(即字典的“值”)作为排序依据。reverse
参数:控制排序方向,reverse=True
为降序(大→小),reverse=False
为升序(小→大,默认)。- 排序结果:返回的是列表(不再是字典),因为字典在 Python 3.7+ 虽有插入顺序,但排序后需要明确的序列结构,方便后续按顺序处理(如取前N名)。
通过这种方法,能快速对字典的“值”进行排序,适用于各类统计场景(如销量、次数、评分等),帮助提取关键信息(如最大值、最小值、Top N等)。
附:字典中的“序”
在 Python 中,字典的“有序性”取决于 Python 版本,且其“序”的定义与“键”或“值”的大小无关,而是与插入顺序相关:
1. 字典的有序性历史
- Python 3.6 及之前:字典是无序的。遍历字典时,键值对的顺序不固定,与插入顺序无关(底层哈希表实现导致)。
- Python 3.7 及之后:字典被官方规范为有序的,会严格保留键值对的插入顺序。遍历字典时,顺序与插入时的先后顺序一致。
2. 字典的“序”:按插入顺序,而非键/值
Python 3.7+ 中字典的“有序”,指的是记住键值对被插入的先后顺序,而不是按“键的大小”或“值的大小”排序。
示例(Python 3.7+):
# 按插入顺序添加键值对
my_dict = {"b": 2,"a": 1,"c": 3
}# 遍历字典,输出顺序与插入顺序一致
for key, value in my_dict.items():print(key, value)
输出结果(与插入顺序相同):
b 2
a 1
c 3
可以看到:
- 键的顺序是
b → a → c
(插入顺序),而非按键的字母顺序(a → b → c
); - 也非按值的大小顺序(
1 → 2 → 3
)。
3. 与“排序”的区别
字典的“有序”(插入顺序)≠ “排序”(按键/值规则排列):
- 有序:被动保留插入时的顺序,不会主动调整。
- 排序:需要通过
sorted()
等方法主动按规则(键、值或自定义逻辑)重新排列,得到的是列表(不再是字典)。
例如,对上面的 my_dict
按“键的字母顺序”排序:
# 按键排序(得到列表,非字典)
sorted_by_key = sorted(my_dict.items(), key=lambda x: x[0])
print(sorted_by_key) # 输出:[('a', 1), ('b', 2), ('c', 3)]