2011-07-18 10 views
0

私はdictsの配列を持っています。この作品はPythonでDictを使ってソートする

tickets.sort(key=itemgetter('start'))tickets.sort(key=itemgetter('start'))の場合、私は2番目の基準をソートする必要があります(これを行う簡単な方法があれば、それはすべて解決するだろう)ので、私は自分の並べ替えを書いてみたい。私は

unhashable type: 'dict' error. 

これを行う方法はあり

を取得し、私は、フォーム

tickets.sort(sort_function) 

で、前にそれをやったが、それは、この動作しませんか?私は重要な何かを忘れてしまった

EDIT

。第2の基準については、単純な大/小ではない。これは、もしスタートのラインに沿って==「特定」だ、-1を返し

+1

あなたが必要です。解は 'key = lambda x:...'のようなものでなければなりません。 –

答えて

5

あなたは単にitemgetterの2番目のパラメータを渡すことができますし、それはあなたのために必要な機能を作成します。

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

私はあなたの問題を考えますあなたが書いた関数が何とか辞書を別の辞書のキーとして使用しようとしているということです。辞書はハッシュできないので、そのエラーが発生します。開始が互いに等しい場合しかし、私は(これを行う簡単な方法があれば、すべてを解決すること、)ソートするために、第2の基準を必要とする

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

。第2の基準については、単純な大/小ではない。これは、もしスタートのラインに沿って==「特定」だ、-1を返し

を比較して、簡単な<にそれらを回す方法でタプルの後の項目では、あなたの特別な値を使用してください==、または>:

チケット[「スタート」]は、「特定」である-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) 

:あなたはソート基準についての詳細情報を追加する必要があります

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