全文一览
一、按键排序1.1 思路解析1.2 方法总结 二、按值排序2.1 思路解析2.1.1 生成键值对元组列表2.1.2 对键值对元组列表排序2.1.3 根据列表生成字典 2.2 方法总结python 中的字典默认是无序的,而许多应用场景中需要对字典的键、值进行排序,因此 python 中的字典排序也就成为了面试中的高频话题。
在进入正文之前,让我们先以 name为 键、以 age 为值 创建字典:
d = {'Caitlyn': 21, 'Darius': 45, 'Bard': 33, 'Ezreal': 24, 'Akali': 31, 'Fiora': 43}
如何按照键、值分别对字典进行排序呢?
>>> d.keys()dict_keys(['Caitlyn', 'Darius', 'Bard', 'Ezreal', 'Akali', 'Fiora'])>>> d.values()dict_values([21, 45, 33, 24, 31, 43])
一、按键排序
1.1 思路解析
对键排序前要先获得键的列表:
>>> list(d.keys())['Caitlyn', 'Darius', 'Bard', 'Ezreal', 'Akali', 'Fiora']
通过 sorted 对列表进行排序:
>>> sorted(list(d.keys())) ['Akali', 'Bard', 'Caitlyn', 'Darius', 'Ezreal', 'Fiora']
python 中的 sorted 支持直接对键排序:
>>> sorted(d.keys()) ['Akali', 'Bard', 'Caitlyn', 'Darius', 'Ezreal', 'Fiora']
如果是逆序,设置 “reverse=True”即可
>>> sorted(d.keys(), reverse=True) ['Fiora', 'Ezreal', 'Darius', 'Caitlyn', 'Bard', 'Akali']
之后,配合 生成式 即可实现有序字典的生成:
>>> {k:d[k] for k in sorted(d.keys())} {'Akali': 31, 'Bard': 33, 'Caitlyn': 21, 'Darius': 45, 'Ezreal': 24, 'Fiora': 43}>>> dict(sorted(d.items())) {'Akali': 31, 'Bard': 33, 'Caitlyn': 21, 'Darius': 45, 'Ezreal': 24, 'Fiora': 43}
1.2 方法总结
dict(sorted(d.items()))dict(sorted(list(d.items())))dict(sorted(list(dic.items()),key=lambda x:x[0])){k:d[k] for k in sorted(d.keys())} {k:d[k] for k in sorted(list(d.keys()))} dict(sorted([(k,v) for k,v in d.items()])dict(sorted([(k,v) for k,v in d.items()],key=lambda x:x[0]))
二、按值排序
2.1 思路解析
2.1.1 生成键值对元组列表
按值排序必须绑定键进行排序,否则根据值无法获取键。这里我们采用 zip 构建生成器进行绑定:
>>> zip(d.keys(),d.values())<zip object at 0x000001F676EF8840>
然后将其转换化为列表,用于后续排序:
>>> list(zip(d.keys(),d.values()))[('Caitlyn', 21), ('Darius', 45), ('Bard', 33), ('Ezreal', 24), ('Akali', 31), ('Fiora', 43)]
以上两步也可以采用元组列表实现键值的绑定:
>>> [(k,d[k]) for k in d.keys()] [('Caitlyn', 21), ('Darius', 45), ('Bard', 33), ('Ezreal', 24), ('Akali', 31), ('Fiora', 43)]
2.1.2 对键值对元组列表排序
之后采用 sorted 方法指定按照元组按值(x[1])进行排序:
>>> sorted([(k,d[k]) for k in d.keys()], key=lambda x:x[1])[('Caitlyn', 21), ('Ezreal', 24), ('Akali', 31), ('Bard', 33), ('Fiora', 43), ('Darius', 45)]
还可以对 list(zip()) 进行排序:
>>> sorted(list(zip(d.keys(), d.values())), key=lambda x:x[1]) [('Caitlyn', 21), ('Ezreal', 24), ('Akali', 31), ('Bard', 33), ('Fiora', 43), ('Darius', 45)]
python 还支持对 zip() 直接排序:
>>> sorted(zip(d.keys(), d.values()), key=lambda x:x[1]) [('Caitlyn', 21), ('Ezreal', 24), ('Akali', 31), ('Bard', 33), ('Fiora', 43), ('Darius', 45)]
要想设置按照年龄降序,可以使用 reverse=True:
>>> sorted([(k,d[k]) for k in d.keys()], key=lambda x:x[1], reverse=True) [('Darius', 45), ('Fiora', 43), ('Bard', 33), ('Akali', 31), ('Ezreal', 24), ('Caitlyn', 21)]
2.1.3 根据列表生成字典
然后使用 字典生成方法 即可生成字典:
>>> {tup[0]:tup[1] for tup in sorted([(k,d[k]) for k in d.keys()], key=lambda x:x[1])} {'Caitlyn': 21, 'Ezreal': 24, 'Akali': 31, 'Bard': 33, 'Fiora': 43, 'Darius': 45}
2.2 方法总结
dict(sorted(d.items(),key=lambda x:x[1]))dict(sorted(list(d.items()),key=lambda x:x[1]))dict(sorted([(k,v) for k,v in d.items()],key=lambda x:x[1])){k:v for (k,v) in sorted(zip(d.keys(),d.values()), key=lambda x:x[1])}{k:v for (k,v) in sorted(list(zip(d.keys(),d.values())), key=lambda x:x[1])}{k:v for (k,v) in sorted([(k,d[k]) for k in d.keys()], key=lambda x:x[1])}{k:d[k] for (k,v) in sorted([(k,d[k]) for k in d.keys()], key=lambda x:x[1])}{tup[0]:tup[1] for tup in sorted([(k,d[k]) for k in d.keys()], key=lambda x:x[1])}{tup[0]:d[tup[0]] for tup in sorted([(k,d[k]) for k in d.keys()], key=lambda x:x[1])}
推荐阅读:
【python】创建字典方法汇总
【python】生成式的使用
更多 python 的使用方法和应用,敬请关注后续更新~