【python】字典按键、按值排序

全文一览

  • 一、按键排序
    • 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 的使用方法和应用,敬请关注后续更新~

你可能感兴趣的:(python语法技巧,python,开发语言,数学建模)