how to Sort Python Dictionaries by Key or Value

众所周知,python中字典是无序的,那么该如何对字典排序呢?

例如下面的字典:

1
numbers = {'second': 2,'first': 1,  'third': 3, 'Fourth': 4}

我们可以通过list()函数打印value,

1
2
>>>list(numbers)
['second', 'first', 'third', 'Fourth']

备注:

python3.6.4 以上的版本,字典根据插入的顺序自动排序

如何根据key 对字典排序

可以使用python的内置函数sorted 来对字典排序,如下面的代码

1
2
>>> sorted(numbers)
['Fourth', 'first', 'second', 'third']

结果有点差强人意,因为默认sorted函数是根据字母的顺序升序排列的,这里的字典中 key 恰好是字母,所以才会显示这个结果。

根据value对字典排序

用同样的方法,我们可以根据value来排序

1
2
>>> sorted(numbers.values())
[1, 2, 3, 4]

如何根据自定义的规则对字典排序

sorted函数还有一个可选参数叫key,注意这里的key和字典的key没有关系,根据指定的key 来进行排序,实现的机制类似迭代器。来看这个例子:

1
2
>>> sorted(numbers,key=numbers.__getitem__)
['first', 'second', 'third', 'Fourth']

这里我们使用了字典类中内置函数__getitem__ 在遍历字典值的过程中,获取对应的值来对字典排序

关于__getitem__ 函数的详细说明,请参考官方文档。

当然我们也可以使用列表推导的方式来进行排序(实质上是转化成了列表来进行排序)

1
2
3
4
>>> sorted(numbers,key=numbers.__getitem__,reverse=True)
['Fourth', 'third', 'second', 'first']
>>> [value for (key,value) in sorted(numbers.items(),reverse=True)]
[3, 2, 1, 4]

字典的key是数字或者字母的情况下对字典排序

1
2
>>> sorted(numbers,key=str.lower)
['first', 'Fourth', 'second', 'third']

我们定义一个新的字典

1
2
3
4
5
>>> month = dict(one='January',
two='February',
three='March',
four='April',
five='May')

通过__getitem__方法比较 我们定义的字典month中对应的值

1
2
3
>>> numbermap = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5}
>>> sorted(month, key=numbermap.__getitem__)
['one', 'two', 'three', 'four', 'five']

同样的原理,可以使用列表推导来实现排序

1
2
>>> [month[i] for i in sorted(month,key=numbermap.__getitem__)]
['January', 'February', 'March', 'April', 'May']

定义一个方法来定义我们自己的排序规则

1
2
3
4
5
6
7
8
9
10
11
def repeats(string):
# Lower the case in the string
string = string.lower()

# Get a set of the unique letters
uniques = set(string)

# Count the max occurrences of each unique letter
counts = [string.count(letter) for letter in uniques]

return max(counts)

根据字母小写排序

1
2
>>> sorted(month.values(), key=repeats, reverse=True)
['February', 'January', 'March', 'April', 'May']

使用lambda表达式排序

使用lambda表达式

1
2
>>> sorted(month.items(),key=lambda x:x[1])
[('four', 'April'), ('two', 'February'), ('one', 'January'), ('three', 'March'), ('five', 'May')]
1
2
>>> sorted(month.items(),key=lambda x:x[0])
[('five', 'May'), ('four', 'April'), ('one', 'January'), ('three', 'March'), ('two', 'February')]

其中:

  • lambda x:x[1] 表明根据值排序
  • lambda x:x[0] 表明根据键排序

以上就是python中对字典排序的一个总结,希望能帮到大家。

坚持原创技术分享,您的支持将鼓励我继续创作!