36

ディクショナリを最初に値reverse=Trueでソートし、値を繰り返す場合はキーでソートする必要があります。reverse=False

これまでのところ、私はこれを持っています

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

3 に答える 3

59

以下は入力に対して機能します。

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

「値」は数値であるため、符号を変更することでソート順を簡単に逆にすることができます。

つまり、この並べ替えは値 ( -x[1]) で並べ替え (負号は最初に大きな数字を配置します)、次に同じ数値についてはキー ( x[0]) に従って並べ替えます。

大きなアイテムを最初に配置するために値を簡単に「否定」できない場合、簡単な回避策は 2 回ソートすることです。

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

Pythonのソートは安定しているため、これは機能します。

于 2013-01-22T19:08:55.393 に答える
4
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)]
于 2013-01-22T19:09:19.953 に答える
2

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

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は次のようなものです:

 defaultdict(<type 'list'>, {1: ['A', 'I', 'J'], 2: ['A'], 3: ['B']}

つまり、キーとしての新しいものdictと、値としてリストに保存された対応するアルファベット。1,2,3...

これで、とを繰り返して、とを使用し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)]
于 2013-01-22T19:14:44.763 に答える