繁体   English   中英

使用字典在 python 中排序

[英]Sorting in python with a dict

我有一系列的字典。 这有效

tickets.sort(key=itemgetter('start')) ,但是如果开始彼此相等,我需要第二个标准来排序(如果有一种简单的方法可以解决所有问题),所以我会喜欢写我自己的排序。 我以前做过,形式是

tickets.sort(sort_function)

但它不适用于这个,我明白了

unhashable type: 'dict' error. 

有没有办法做到这一点?

编辑

我忘记了一件重要的事情。 对于第二个标准,这不是一个简单的大于/小于大小写。 它类似于 if start == "specific", return -1

您可以简单地将第二个参数传递给 itemgetter,它将为您创建必要的 function:

tickets.sort(key = itemgetter('start', 'end'))

…但是,如果起点彼此相等,我需要第二个标准来排序(如果有一种简单的方法可以解决所有问题)

有一个简单的方法可以做到这一点:为每个项目的 key 使用一个元组 因为元组比较将较早的项目视为更重要,所以仅当较早的项目匹配时才考虑较晚的项目。

例如,给定一个包含两个数字的项目列表,其中排序应该按第一个(更重要的)数字升序,第二个数字降序:

>>> data = [
...   (1, 0),
...   (1, 1),
...   (1, 2),
...   (0, 0),
...   (2, 0),
... ]
>>> data.sort(key=lambda (a, b): (a, -b))
>>> data
[(0, 0), (1, 2), (1, 1), (1, 0), (2, 0)]

我忘记了一件重要的事情。 对于第二个标准,这不是一个简单的大于/小于大小写。 它类似于 if start == "specific", return -1

在元组的后面项目中使用您的特殊值,将它们变成简单的 <、== 或 > 比较:

def ticket_key(ticket):
  start = ticket["start"]
  if start == "specific":
    second = -1
  else:
    second = ticket["blah"]
  return (start, second)

tickets.sort(key=ticket_key)

现在,对于 ticket["start"] 为“特定”的项目,使用 -1 代替 ticket["blah"]:

>>> data = [
...   {"start": "specific"}, # "blah" doesn't even exist here
...   {"start": "specific", "blah": 2},
...   {"start": "42", "blah": 1},
...   {"start": "42", "blah": 0},
... ]
>>> data.sort(key=ticket_key)
>>> data
[{'start': '42', 'blah': 0},
 {'start': '42', 'blah': 1},
 {'start': 'specific'},
 {'start': 'specific', 'blah': 2}]

我认为您的问题是您编写的 function 以某种方式试图将字典用作另一个字典的键。 由于字典是不可散列的,因此您会收到该错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM