11

タプルのリストがある場合:

results = [('10', 'Mary'), ('9', 'John'), ('10', 'George'), ('9', 'Frank'), ('9', 'Adam')]

スコアボードに表示されるように、リストを並べ替えるにはどうすればよいですか?つまり、スコアを最大から最小に並べ替えますが、同点は名前のアルファベット順に並べ替えますか?

したがって、ソート後、リストは次のようになります。

results = [('10', 'George'), ('10', 'Mary'), ('9', 'Adam'), ('9', 'Frank'), ('9', 'John')]

現時点で私にできることは だけですがresults.sort(reverse=True)、タイを破ると逆のアルファベットも...

どんな助けでも大歓迎です。ありがとう!

4

4 に答える 4

24

あなたが望むものを達成する最も簡単な方法は、python ソートが安定しているという事実を利用することです。これにより、最初にアルファベット順に並べ替え、次にスコアで並べ替えることができます。

In [11]: results = [(10, 'Mary'), (9, 'John'), (10, 'George'), (9, 'Frank'), (9, 'Adam')]

In [12]: results.sort(key=lambda x: x[1])

In [13]: results.sort(key=lambda x: x[0], reverse=True)

In [14]: results
Out[14]: [(10, 'George'), (10, 'Mary'), (9, 'Adam'), (9, 'Frank'), (9, 'John')]

最初の並べ替えは、昇順でアルファベット順に並べ替えます。2 番目の並べ替えでは、スコアが等しい要素の相対的な順序を維持しながら、スコアで降順に並べ替えます。

これを行うと、さらに複雑な並べ替えを行うことができます。最初にセカンダリキーで並べ替え、次に最初のキーで並べ替える必要があることを覚えておいてください。(キーが 3 つある場合は、最初に 3 番目、次に 2 番目、最後にメイン キーで並べ替えます)。

2 回呼び出したくない場合はsort、より複雑なkey関数を作成する必要があります。何かのようなもの:

In [50]: def key(elem):
    ...:     return elem[0], [-ord(c) for c in elem[1]]

In [51]: sorted(results, key=key, reverse=True)
Out[51]: [(10, 'George'), (10, 'Mary'), (9, 'Adam'), (9, 'Frank'), (9, 'John')]

特に、辞書順に並べ替えられたもの (文字列、タプル、リストなど) があるたびに、すべての要素の符号を変更して順序を逆にすることができます。

于 2013-08-24T06:50:24.097 に答える
7

sortメソッドはオプションのkeyパラメーターを受け入れます。

key は、各リスト要素から比較キーを抽出するために使用される 1 つの引数の関数を指定します

文字列を数値に変換する必要があります。

>>> results = [('10', 'Mary'), ('9', 'John'), ('10', 'George'), ('9', 'Frank'), ('9', 'Adam')]
>>> results.sort(key=lambda x: (int(x[0]), x[1]), reverse=True)
>>> results
[('10', 'Mary'), ('10', 'George'), ('9', 'John'), ('9', 'Frank'), ('9', 'Adam')]
于 2013-08-24T04:46:11.343 に答える
-1

使うだけsortedで十分

>>> sorted(results)
[('10', 'George'), ('10', 'Mary'), ('9', 'Adam'), ('9', 'Frank'), ('9', 'John')]

デフォルトcmp関数は、0 から n までのタプルの各メンバーをこの順序で比較することにより、タプルの優先順位をチェックします

于 2013-08-24T04:45:57.897 に答える