2011-12-23 56 views
12

如果我有一個對象與Python集合中的一個元素進行比較,但不是相同的對象,是否有合理的方法來獲取對集合中對象的引用?用例將使用該組來識別和共享重複的數據。如何使用等效對象訪問集合中的元素?

示例(Python 2.7):

>>> a = "This is a string" 
>>> b = "This is a string" 
>>> a is b 
False 
>>> a == b 
True 
>>> s = set((a,)) 
>>> b in s 
True 

如何使用bs得到a參考?我可以想到一種方法,但我不確定它是否取決於實施,無論您獲得a還是b編輯:當s有多個元素時,這不起作用;路口是很自然的實現類似[x for x in smaller_set if x in larger_set]

​​

也許一個很好的解決方法是使用每個鍵映射到它自身的字典,而不是集。

+2

如果您需要兩個相同的可哈希對象中的特定一個,那麼看起來可能該對象不應該相等和/或可哈希。你爲什麼需要這個? – delnan 2011-12-23 12:54:13

+0

我認爲你的懷疑是有道理的:pypy 1.7.0和ironpython 3.0都可以爲你的最終c返回False。 – DSM 2011-12-23 12:59:14

+0

我可以通過將對同等對象的引用更改爲對同一對象的引用來節省內存。 – 2011-12-23 13:01:20

回答

3

我在python-list上發現了一個類似的問題:Get item from set。關於get_equivalent(container, item) (Python recipe)有一個聰明的答案。

訣竅是爲'key'對象構造一個包裝器對象,並使用in運算符檢查包裝器是否在集合中。如果包裝的哈希值等於密鑰,則其__eq__方法可以訪問該集合中的對象,並保存對該對象的引用。討論的一個重點是設置元素的__eq__方法必須爲NotImplemented返回無法識別的類型,否則封裝程序的__eq__可能不會被調用。

1

您的用例聽起來像是一個用於字典的用例。作爲鍵,使用與「外部」對象相等的對象的屬性,並將其作爲所需對象本身的值。

如果它是一個簡單的使用情況下,你可以有一個線性seartch,但是,你可以做明顯的 - 它會不會有什麼不好:

def get_equal(in_set, in_element): 
    for element in in_set: 
     if element == in_element: 
      return element 
    return None 

如果你需要什麼,你AR什麼問for(我可以想到一些用例) - wya要去創建一個自定義的字典類,它有一個集合作爲其成員之一,對成員集合實現代理方法,並且在字典和集合方法中,保持字典和設置內容的同步。這對於正確執行而言會很費時,但相對簡單。

相關問題