[英]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.