【Python 技巧】对字典按照键(key)或者值(value)排序

先总结一下,分为以下四种情况:

  • 情况一:按照键排序,只输出排序后所有的键
  • 情况二:按照值排序,只输出排序后所有的值
  • 情况三:按照键排序,同时输出排序后所有的键和对应的值
  • 情况四:按照值排序,同时输出排序后所有的键和对应的值
情况一:按照键排序,只输出排序后所有的键

直接使用 sorted() 方法,默认是对字典的键进行排序

>>> dict = {'b': 2, 'a': 1, 'd': 4, 'c': 3}
>>> print(sorted(dict))
['a', 'b', 'c', 'd']

也可以先用 dict.keys() 取字典的键,然后再使用 sorted() 方法进行排序

>>> dict = {'b': 2, 'a': 1, 'd': 4, 'c': 3}
>>> print(sorted(dict.keys()))
['a', 'b', 'c', 'd']

以上方法是从小到大排序,如果是从大到小,添加 reverse=True 即可

>>> dict = {'a': 2, 'b': 1, 'c': 4, 'd': 3}
>>> print(sorted(dict.keys(), reverse=True))
['d', 'c', 'b', 'a']
情况二:按照值排序,只输出排序后所有的值

先用 dict.values() 取字典的值,然后再使用 sorted() 方法进行排序

>>> dict = {'a': 2, 'b': 1, 'c': 4, 'd': 3}
>>> print(sorted(dict.values()))
[1, 2, 3, 4]

同理,如果是从大到小排序,添加 reverse=True 即可

>>> dict = {'a': 2, 'b': 1, 'c': 4, 'd': 3}
>>> print(sorted(dict.values(), reverse=True))
[4, 3, 2, 1]
情况三:按照键排序,同时输出排序后所有的键和对应的值

方法一:dict.items() 方法可以得到包含字典键和值的元组,然后使用匿名函数 lambda,其中 i[0] 表示字典的键

>>> dict = {'a': 2, 'b': 1, 'c': 4, 'd': 3}
>>> print(sorted(dict.items(), key=lambda i: i[0]))
[('a', 2), ('b', 1), ('c', 4), ('d', 3)]

方法二:使用 operator 模块中的 itemgetter 函数,其中 itemgetter(0) 表示字典的键

>>> from operator import itemgetter
>>> dict = {'a': 2, 'b': 1, 'c': 4, 'd': 3}
>>> print(sorted(dict.items(), key=itemgetter(0)))
[('a', 2), ('b', 1), ('c', 4), ('d', 3)]

itemgetter 函数用于获取对象的哪些维的数据,参数为一些序号,以下举例说明:

>>> import operator
>>>
>>> a = [1, 2, 3, 4]
>>> b = operator.itemgetter(0)  # 定义函数b,获取对象的第0个域的值
>>> print(b(a))
1
>>> b = operator.itemgetter(0, 1) # 定义函数b,获取对象的第0个和第1个域的值
>>> print(b(a))
(1, 2)
情况四:按照值排序,同时输出排序后所有的键和对应的值

方法一:与情况三类似只需要将 i[0] 改成 i[1] 即可

>>> dict = {'a': 2, 'b': 1, 'c': 4, 'd': 3}
>>> print(sorted(dict.items(), key=lambda i: i[1]))
[('b', 1), ('a', 2), ('d', 3), ('c', 4)]

方法二:与情况三类似只需要将 itemgetter(0) 改成 itemgetter(1) 即可

>>> from operator import itemgetter
>>> dict = {'a': 2, 'b': 1, 'c': 4, 'd': 3}
>>> print(sorted(dict.items(), key=itemgetter(0)))
[('a', 2), ('b', 1), ('c', 4), ('d', 3)]
发布了149 篇原创文章 · 获赞 518 · 访问量 46万+

猜你喜欢

转载自blog.csdn.net/qq_36759224/article/details/104378484