2012-03-30 15 views
2

私は、例えばattrgetterで簡単に複製できない複雑な基準に基づいて事前ソートされたオブジェクトのリストを持っています。私はそれらのサブセットをアルファベット順に並べ替えたいと思っています。もし両方がプロパティーを持っていれば:part_of_subsetです。条件に基づいた委任ソート

アルファベット順の並べ替え機能を再定義せずにこれを行うにはどうすればよいですか?

def cmp(a, b): 
    if a.part_of_subset and b.part_of_subset: 
     # sort alphabetically -- must I duplicate alphabetic sort code? 
    return 0 

答えて

4

はソートの比較機能を定義していますが、通常はキー機能を使用することをお勧めします。あなたのアプリケーションでは、このキー関数は、そのまま残す必要があるすべてのものと同じ値と、残りのもののソートキーを返さなければなりません。例

def my_key(a): 
    if a.part_of_subset: 
     return 0, 
    return 1, a.sort_key 

collection.sort(key=my_key) 

ソートされたサブセットは、すでにソートされた要素の後の1つのブロックにグループ化されます。

編集sort_keyNoneことがないかもしれない、とPython 3のコードを動作させるためにという制限を取り除くために、私は、キーの機能を更新しました。古いバージョンでは、ソートキーが異なるタイプの場合には、奇妙な結果につながっている可能性もあります(それはあまりにも便利すぎるとは思われませんが)。

+0

クリーナーでさえも。とても有難い。 – ash

1

あなただけreturn cmp(a, b)を言って、一定の条件の下で別の関数にソートを委任することができます。私は組み込みのPython関数cmpを指していて、cmpではありません。

関連する問題