5

Python初心者のビットですが、次のタプルのリストを取得しました。値で並べ替える必要があります。値が同じ場合は、アルファベット順にタイを解きます。サンプルは次のとおりです。

#original
list_of_medals = [('Sweden', 24), ('Germany', 16), ('Russia', 10), ('Ireland', 10), ('Spain', 9), ('Albania', 8), ('Lithuania', 7), ('Iceland', 6), ('Malta', 5), ('Italy', 5), ('Serbia', 4), ('Estonia', 4), ('Turkey', 4), ('Moldova', 2), ('Azerbaijan', 2)]
#                                                              \____/                                                                                                                      \_____/                                         \______/
#after sorting                                                 /    \                                                                                                                      /     \                                         /      \
sorted_medals  = [('Sweden', 24), ('Germany', 16), ('Ireland', 10), ('Russia', 10), ('Spain', 9), ('Albania', 8), ('Lithuania', 7), ('Iceland', 6), ('Malta', 5), ('Italy', 5), ('Estonia', 4), ('Serbia', 4), ('Turkey', 4), ('Azerbaijan', 2), ('Moldova', 2)]

operatorモジュールでおそらく可能ですか?

4

2 に答える 2

12

この例では、/keyへの引数としてラムダ関数を使用します。sort()sorted()

In [59]: sorted(list_of_medals, key=lambda x:(-x[1],x[0]))
Out[59]: 
[('Sweden', 24),
 ('Germany', 16),
 ('Ireland', 10),
 ('Russia', 10),
 ('Spain', 9),
 ('Albania', 8),
 ('Lithuania', 7),
 ('Iceland', 6),
 ('Italy', 5),
 ('Malta', 5),
 ('Estonia', 4),
 ('Serbia', 4),
 ('Turkey', 4),
 ('Azerbaijan', 2),
 ('Moldova', 2)]

国名を昇順x[1]に並べ替えながら、メダルを降順に並べ替えるには、 の否定が必要です(単純に設定しただけでは実現できません)。reverse=True

複数の人がコメントで指摘しているように、複合キーで複雑な並べ替えを行うより一般的な方法は、いくつかの並べ替え手順を実行することです。これを行うには、最も重要でないものから始めて、一度に 1 つのコンポーネントで並べ替えます。

In [67]: temp = sorted(list_of_medals, key=itemgetter(0))

In [68]: sorted(temp, key=itemgetter(1), reverse=True)
Out[68]: 
[('Sweden', 24),
 ('Germany', 16),
 ('Ireland', 10),
 ('Russia', 10),
 ...

これは、Python の並べ替えが安定しているという事実に依存しています。つまり、等しい項目は並べ替えられません。

于 2012-11-20T21:21:31.477 に答える
4

sorted次の関数を使用できます。

sorted_by_medals = sorted(list_of_medals, key=lambda tup: (-tup[1], tup[0]))
于 2012-11-20T21:21:49.727 に答える