[英]Set subtraction in Python
在我的Python代碼中,我有這個類:
class _Point2D:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return 'point: (' + str(self.x) + ', ' + str(self.y) + ')'
並且有兩個列表, initialPointsList
和burnedPointsList
:
initialPointsList = []
initialPointsList.append(_Point2D(1, 1))
initialPointsList.append(_Point2D(1, 2))
initialPointsList.append(_Point2D(1, 3))
initialPointsList.append(_Point2D(1, 4))
initialPointsList.append(_Point2D(1, 5))
initialPointsList.append(_Point2D(1, 6))
initialPointsList.append(_Point2D(1, 7))
burnedPointsList = []
burnedPointsList.append(_Point2D(1, 2))
burnedPointsList.append(_Point2D(1, 3))
我想計算initialPointsList
和burnedPointsList
之間的區別
我執行了:
result = set(initialPointsList) - set(burnedPointsList)
for item in result:
print item
並獲得以下輸出:
point: (1, 1)
point: (1, 4)
point: (1, 5)
point: (1, 6)
point: (1, 2)
point: (1, 3)
point: (1, 7)
但我期待另一個結果,沒有燒傷點坐標:
point: (1, 1)
point: (1, 4)
point: (1, 5)
point: (1, 6)
point: (1, 7)
在Python中最好的方法是什么? 我的代碼有什么不對?
如果要使其正常工作,則需要定義__eq__()
和__hash__()
特殊方法。 如果定義__eq__()
,定義__ne__()
通常也是個好主意。
__eq__()
的參數是等價的(它們的x和y值相同),則它們應該返回True
。 __ne__()
應該反其道而行之。 通常, __eq__()
通常也需要進行類型檢查,如果“其他”值與self
類型不同,則返回false。
__hash__()
應該返回一個數字。 對於與__eq__()
相比較的兩個值,該數字應該相同,並且它是可取的但不是嚴格要求它對於不同的值是不同的。 一個很好的實現是這樣的:
def __hash__(self):
return hash((self.x, self.y))
元組散列算法將以統計上良好的方式組合其元素的散列值。 你有時可能會在這里看到人們推薦按位異或(即self.x ^ self.y
),但這不是一個好主意。 該技術拋棄了它們共有的所有位,這使得散列性能較差(例如,如果self.x == self.y
它總是返回零)。
最后,您需要確保在構造對象后哈希值不會更改 。 通過將self.x
和self.y
轉換為只讀屬性,可以輕松完成此操作。
為了完整起見,這里將是__eq__
, __ne__
和__hash__
在凱文的答復中提到的方法。
def __eq__(self, other):
return type(self) is type(other) and self.x == other.x and self.y == other.y
def __ne__(self, other):
return not self.__eq__(other)
def __hash__(self):
return hash((self.x, self.y))
我通過將這些方法添加到您的類來測試它,它產生預期的輸出:
point: (1, 5)
point: (1, 6)
point: (1, 1)
point: (1, 4)
point: (1, 7)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.