我有一系列的词汇。这工作
tickets.sort(key=itemgetter('start'))
,但是如果开始相等,我需要第二个标准来排序(如果有一个简单的方法可以解决所有问题),所以我想写自己的分类。我之前已经以
tickets.sort(sort_function)
但它不能用于此,我得到了
unhashable type: 'dict' error.
有办法做到这一点吗?
修改的
我忘记了重要的事情。对于第二个标准,它不是一个简单的更大/更小的情况。这是如果start ==“specific”,返回-1
答案 0 :(得分:5)
您只需将第二个参数传递给itemgetter,它就会为您创建必要的功能:
tickets.sort(key = itemgetter('start', 'end'))
答案 1 :(得分:1)
...但是如果开始时彼此相等,我需要第二个标准来排序(如果有一个简单的方法可以解决所有问题)
有一种简单的方法可以做到这一点:use a tuple for each item's 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)]
我忘记了重要的事情。对于第二个标准,它不是一个简单的更大/更小的情况。这是如果start ==“specific”,返回-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”]为“specific”的项目,使用-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}]
答案 2 :(得分:0)
我认为您的问题是您编写的函数以某种方式尝试使用字典作为另一个字典的键。由于字典不可用,因此会出现错误。