がkey
機能が優先の高い順にアイテムを、タプルを返す持っている:
table.sort(reverse=True, key=lambda team: (Team.getPoints(team),
Team.getGoalDifference(team),
Team.getName(team))
代わりに、あなたは、アルゴリズム101からの疑似事実を覚えて、実際.sort()
の使用を作ることができ安定です並べ替えを行うため、リスト内のアイテムの相対的な順序は同じであると比較して変更されません。これは、あなたが優先順位の増加順に、3回を並べ替えることができることを意味:
table.sort(reverse=True, key=Team.getName)
table.sort(reverse=True, key=Team.getGoalDifference)
table.sort(reverse=True, key=Team.getPoints)
これは遅くなりますが、あなたは簡単に各ステップがreverse
かどうかで行われるべきかどうかを指定することができます。これは、複数のソートせずに行うことができますcmp_to_key()
を使用して渡しますが、コンパレータ機能は自明だろう、のようなもの:
def team_cmp(t1, t2):
for key_func, reverse in [(Team.getName, True),
(Team.getGoalDifference, True),
(Team.getPoints, True)]:
result = cmp(key_func(t1), key_func(t2))
if reverse: result = -result;
if result: return result
return 0
table.sort(functools.cmp_to_key(team_cmp))
(免責事項:上記メモリから書き込まれ、テストされていない)重点は、「複数のパスなし」であります必ずしも「より速い」ことを意味するものではない。コンパイラ関数からのオーバーヘッドとcmp_to_key()
(いずれもCコアの一部であるlist.sort()
とoperator.itemgetter()
ではなく)はPythonで実装されていますが、これは重要です。
また、key
パラメータに渡すダミー関数を作成する必要はありません。あなたは使用して、直接属性にアクセスすることができます
table.sort(key=lambda t: t.points)
またはattrgetter
オペレータラッパー:
table.sort(key=attrgetter('points'))
[Python Sorting HowTo](http://wiki.python.org/moin/HowTo/Sorting/)を読んでみてください。 (実際には、現時点では読み込みに問題がありますが、常に[Google Cache](http://webcache.googleusercontent.com/search?q=cache:GjjYVDIjFi0J:wiki.python.org/moin/HowTo/)があります。 /ソート/ +&cd = 1&hl = en&ct = clnk&gl = us&client = firefox-a)) – kojiro
うわー。私はまったく同じタスクを持っています:リーグ内のチームをソートする) – imkost
[2つの基準によるPythonリストのソート]の可能な複製(http://stackoverflow.com/questions/5212870/sorting-a-python-list-by-two-criteria ) – GingerPlusPlus