【问题标题】:Sorting list of dictionaries---what is the default behaviour (without key parameter)?字典排序列表---默认行为是什么(没有关键参数)?
【发布时间】:2016-05-10 18:44:09
【问题描述】:

我正在尝试使用 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排序。我在这些方法的默认行为中缺少什么?

【问题讨论】:

  • 旁白:在现代(即没有过时的 :-)版本的 Python 中,你会得到 TypeError: unorderable types: dict() < dict()..
  • 您可以查看this question的答案

标签: python sorting


【解决方案1】:

来自old Python docs

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

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

忽略默认行为,只提供key

【讨论】:

    【解决方案2】:

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

    将一个函数传递给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

    key参数相当强大,可以应付各种需要排序的数据,虽然可能不是很直观。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 2015-03-03
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多