排序词典列表---默认行为是什么(没有关键参数)?

时间:2016-05-10 10:00:34

标签: python sorting

我正在尝试使用sorted

对dict列表进行排序
>>> help(sorted)
Help on built-in function sorted in module __builtin__:

sorted(...)
    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

我刚刚给出了要排序的列表,并根据id进行排序。

>>>l = [{'id': 4, 'quantity': 40}, {'id': 1, 'quantity': 10}, {'id': 2, 'quantity': 20}, {'id': 3, 'quantity': 30}, {'id': 6, 'quantity': 60}, {'id': 7, 'quantity': -30}]
>>> sorted(l) # sorts by id
[{'id': -1, 'quantity': -10}, {'id': 1, 'quantity': 10}, {'id': 2, 'quantity': 20}, {'id': 3, 'quantity': 30}, {'id': 4, 'quantity': 40}, {'id': 6, 'quantity': 60}, {'id': 7, 'quantity': -30}]
>>> l.sort()
>>> l # sorts by id
[{'id': -1, 'quantity': -10}, {'id': 1, 'quantity': 10}, {'id': 2, 'quantity': 20}, {'id': 3, 'quantity': 30}, {'id': 4, 'quantity': 40}, {'id': 6, 'quantity': 60}, {'id': 7, 'quantity': -30}]

sorted的许多示例都表示需要key对dict列表进行排序。但我没有给任何key。为什么它没有根据quantity排序?它是如何选择使用id排序的? 我尝试了另一个名字&年龄,

>>> a
[{'age': 1, 'name': 'john'}, {'age': 3, 'name': 'shyam'}, {'age': 30,'name': 'ram'}, {'age': 15, 'name': 'rita'}, {'age': 5, 'name': 'sita'}]
>>> sorted(a) # sorts by age
[{'age': 1, 'name': 'john'}, {'age': 3, 'name': 'shyam'}, {'age': 5, 'name':'sita'}, {'age': 15, 'name': 'rita'}, {'age': 30, 'name': 'ram'}]

>>> a.sort() # sorts by age
>>> a
[{'age': 1, 'name': 'john'}, {'age': 3, 'name': 'shyam'}, {'age': 5, 'name':'sita'}, {'age': 15, 'name': 'rita'}, {'age': 30, 'name': 'ram'}]

此处根据age排序,但不排序name。我在这些方法的默认行为中缺少什么?

2 个答案:

答案 0 :(得分:3)

来自某些old Python docs

  

映射(字典)比较相等,当且仅当它们的排序(键,值)列表比较相等时。除了平等以外的结果一致地得到解决,但没有另外定义

     

早期版本的Python使用了排序(键,值)列表的字典比较,但对于比较相等的常见情况,这是非常昂贵的。甚至更早版本的Python仅通过标识比较字典,但这引起了惊喜,因为人们希望能够通过将字典与{}进行比较来测试字典的空白。

忽略默认行为,只提供key

答案 1 :(得分:0)

默认情况下,它会与找到的第一个差异进行比较。如果你正在排序字典,这是非常危险的(一致但尚未定义)。

将函数传递给key=参数,该参数从列表中获取值(在本例中为字典)并返回值以进行排序。

>>> a
[{'age': 1, 'name': 'john'}, {'age': 3, 'name': 'shyam'}, {'age': 30,'name': 'ram'}, {'age': 15, 'name': 'rita'}, {'age': 5, 'name': 'sita'}]
>>> sorted(a, key=lambda d : d['name']) # sorts by name
[{'age': 1, 'name': 'john'}, {'age': 30, 'name': 'ram'}, {'age': 15, 'name': 'rita'}, {'age': 3, 'name': 'shyam'}, {'age': 5, 'name': 'sita'}]

请参阅https://wiki.python.org/moin/HowTo/Sorting

关键参数非常强大,因为它可以处理要排序的各种数据,但可能不是很直观。