2013-01-22 4 views
18

を逆に私がreverse=Falseソート第二の値によって、タプルのリスト、逆=真、その後キーで、= Falseの

reverse=Trueとの最初の、価値によって、および値を繰り返すため、ソートキーで辞書をソートする必要がありますこれまでのところ、私は返すこの

dict = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 
sorted(dict.items(), key=lambda x: (x[1],x[1]), reverse=True) 

...

[('B', 3), ('A', 2), ('J', 1), ('I', 1), ('A', 1)] 

は持っているが、私はそれをする必要があります

[('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 

値が同じ場合、指定したとおりにキーを並べ替えることしかできません...しかし、どのようにしてそれらを並べ替えることができますか?

+4

'dict'がリストである - – mgilson

+0

はそれがmgilsonのおかげで動作するようになった、私は似たようなしようとしていた...でも、本当にそれはキーを繰り返していたとして辞書に回す適しリストとはないが、眠くてストレートに考えることができませんでした。ありがとう! –

答えて

27

ご入力して、次の作品:

d = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 
sorted(d,key=lambda x:(-x[1],x[0])) 

あなたの「価値」は数値なので、簡単に記号を変更することにより、ソート順序を逆にすることができます。

つまり、このソートでは、値が(-x[1])(負の符号は大きい番号が最初に入ります)、次に同じ番号の場合は、キー(x[0])に基づいて順番に並べられます。自分の価値観は、そう簡単に「否定」することはできません最初の大きな項目を入れた場合

、簡単な回避策は、二回にソートすることです:Pythonのソートは安定しているので、作品

from operator import itemgetter 
d.sort(key=itemgetter(0)) 
d.sort(key=itemgetter(1),reverse=True) 

3
In [4]: l = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 

In [5]: sorted(l, key=lambda (x,y):(-y,x)) 
Out[5]: [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 
1

あなたはcollections.defaultdictを使用することができます。

値としてリストに保存されたキーとその対応するアルファベットなど 1,2,3...
defaultdict(<type 'list'>, {1: ['A', 'I', 'J'], 2: ['A'], 3: ['B']} 

すなわち新しいdict:今

In [48]: from collections import defaultdict 

In [49]: dic=[('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 

In [50]: d=defaultdict(list) 

In [51]: for x,y in dic: 
    d[y].append(x) 
    d[y].sort()   #sort the list 

dのようなものです。

sorted(d.items)を繰り返し処理し、itertools.chain()itertools.product()を使用して結果を得ることができます。

In [65]: l=[ product(y,[x]) for x,y in sorted(d.items(),reverse=True)] 

In [66]: list(chain(*l)) 
Out[66]: [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 
+0

ここにあなたが何を見ているのか分かりません...もう少し説明してください。P – mgilson

+0

@mgilson oops !! –

関連する問題