簡體   English   中英

在Python中設置減法

[英]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) + ')' 

並且有兩個列表, initialPointsListburnedPointsList

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))

我想計算initialPointsListburnedPointsList之間的區別

我執行了:

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.xself.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM