7

ベクトルの配列があり、それらを長さで並べ替えたい:

class Vector:

     def __init__(self, x, y):
       self.x, self.y = x, y

     def __add__(a, b):
       return Vector(a.x + b.x, a.y + b.y)

     def __str__(a):
       return str(a.x) + ' ' + str(a.y) + '\n'

     def __key__(self):
       return self.x * self.x + self.y * self.y


a = []
a.append(Vector(1,2))
a.append(Vector(1, 1))
a.sort()
print("".join(map(str,a)))

「順序付けできない型: Vector() < Vector()」と書いてあります..メソッドを作成ltしてほしいのです. gtでも使わずにソートしたいcmp。出来ますか?

4

3 に答える 3

7

クラス デコレータを実装__lt____eq__て使用しfunctools.total_ordering、残りの比較メソッドを取得します。

ベクトルをそのように並べる意味がない場合は、いつでもkeyキーワードを使用してsort(またはsortedそのために)使用できます。

mylist.sort(key = lambda v: v.x**2 + v.y**2)
于 2012-08-28T11:36:13.787 に答える
6

ここには 2 つのバリアントがあります。クラス__cmp__に関数を実装するか、この方法で並べ替えを実行します。Vector

...
a.sort(key=Vector.__key__) 
于 2012-08-28T11:37:58.947 に答える
2

Python docs によると、lt/le/gt/ge/eq/ne は

[...]いわゆる「豊富な比較」メソッドであり、__cmp__() に優先して比較演算子に対して呼び出されます

メソッドを実装する場合は__cmp__(self, other)、比較/ソート操作に使用する必要があります。

于 2012-08-28T11:35:33.890 に答える