2013-01-13 8 views
7

私はプログラミングが初めてで、今ではPythonでリーグテーブルを書いています。私は最初のポイントで自分のリーグを分類したいと思います。同じポイントを持つ2つのチームがある場合は、それらをゴール差でソートしたいと思います。同じゴール差があれば、名前でソートしたいと思います。Pythonで複数の条件でソートする

第一の条件は非常に簡単で、以下で働いている:

table.sort(reverse=True, key=Team.getPoints) 

どのように私は次の二つの条件を挿入していますか?

+0

[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

+0

うわー。私はまったく同じタスクを持っています:リーグ内のチームをソートする) – imkost

+0

[2つの基準によるPythonリストのソート]の可能な複製(http://stackoverflow.com/questions/5212870/sorting-a-python-list-by-two-criteria ) – GingerPlusPlus

答えて

4

リストを最初に名前順に並べ替え、次にスコア差で並べ替えます。 Pythonのsortは安定しています。つまり、等しいと比較する要素の順序が保持されます。

10

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')) 
+1

最初と少し違いますか?これはタプル全体に 'reverse = True'を適用しますが、3段階バージョンはそれをポイントに適用するだけです。 – DSM

+0

@DSMそれは、私はあなたがさまざまなステップの順序を変えることができるという例を見出そうとしていましたが、それは明白ではないと思います。 – millimoose

+0

さて、 '* -1'を使ってフィールドを逆転させることはできませんでしたか? –

0

PythonのソートアルゴリズムはACEfanatic02が指摘するように、順序が保存されることを意味stableで、Timsortです。 This linkは、どのように動作するかを視覚的によく説明しています。

+0

そして、Tim Petersは不滅になっています。 – millimoose