2011-07-18 98 views
0

我有一个数组的字典。这工作用字典排序python

tickets.sort(key=itemgetter('start')),但是,如果开始平等对方,我需要第二个标准排序(如果有一个简单的方法来做到这一点,这将解决一切),所以我想写我自己的排序。我以前做过,形式

tickets.sort(sort_function) 

,但它不具有这方面的工作,我得到

unhashable type: 'dict' error. 

有没有办法做到这一点?

编辑

我忘记一些重要的事情。对于第二个标准,这不是一个简单的大于/小于个案。它是沿着如果start ==“具体”,返回-1

+1

你应该添加有关排序标准更多信息你需要。解决方案应该像'key = lambda x:...' –

回答

5

你可以简单地传递给itemgetter第二个参数,它会为你创建必要的功能行:

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

我认为你的问题是你写的函数试图用字典作为另一个字典的关键字。既然字典是不可干扰的,你会得到那个错误。

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 ==“具体”,返回-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) 

现在对于项目的门票收入[“开始”]是“具体”,-1是用来代替车票[“嗒嗒”]:

>>> 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}]