13

関数の引数をmyclass使用して、の配列を並べ替えることができます。keysorted

sortedlist = sorted(myclasses, key=lambda obj: obj.myproperty)

クラスの自然な順序を定義する方法はありますか?おそらく、毎回キーを渡す必要がないようにするための魔法の方法はありますか?

例えば、

class myclass:
    def __init__(self,a,b):
        self.key1 = a
        self.key2 = b

    def __sortkey__(self):
        return self.key2

それとも、おそらく定義すれば自然に機能する__le__でしょうか?

4

3 に答える 3

17

に加えて__cmp__、いわゆる「豊富な比較演算子」__eq____le____lt____gt__、およびを使用して行うこともできます__ge__。それらすべてを定義するのではなくfunctools.total_ordering、2.7+/3.1+ でクラス デコレータを使用できます。__cmp__3.x でなくなりました。

于 2012-07-28T23:12:55.080 に答える
3

オーバーライドしてやります__cmp__

class myclass:
    def __init__(self,a,b):
        self.key1 = a
        self.key2 = b

    def __cmp__(self, other):
        return cmp(self.key2, other.key2)
于 2012-07-28T23:09:21.497 に答える
3

この前の質問を参照してください。答えは、 を使用するだけで問題を解決できるということですが、__lt__を使用する方が適切functools.total_orderingです。

于 2012-07-28T23:13:34.940 に答える