2017-03-17 29 views
3

我使用set當我需要保持一個值的參考列表,我想保持唯一(後來,檢查是否inset)。這不適用於dict,因爲它不可散列。如何保持獨特的口袋?

quite a few techniques爲「uniquify」的dict一個list但他們都認爲我有一個最後的list,我想減少到獨特的元素。

如何以動態的方式做到這一點?對於set我只是.add()和元素,並會知道它只會被添加,如果它是唯一的。就是這樣一個(編輯:理想的,但不一定是)可用於dict一袋(我用的是「包」,因爲我不希望可能的答案限制爲任何數據容器)

+0

您可以使用基於字典的自定義哈希函數來實現自定義設置樣的對象? – PinkFluffyUnicorn

+0

[「Bag」意思是「multiset」](https://en.wikipedia.org/wiki/Set_(abstract_data_type)#Multiset);也許你應該問一下可散列/不可變的字典,並忽略容器的類型。 – jwodder

+0

因此,每當「dict」中的某個鍵或值發生更改時,您的集合式結構將被重新測試? –

回答

1

您可以使用frozen dict這是一個常規字典的不可變實現。

這種方法應該允許你在一個集合中使用凍結字典。

>>> from frozendict import frozendict 
>>> x = [frozendict({'a':2, 'b':3}),frozendict({'b':3, 'a':2})] 
>>> set(x) 
{<frozendict {'b': 3, 'a': 2}>} 
>>> frozendict({'b': 3, 'a': 2}) in set(x) 
True 
>>> frozendict({'b': 4, 'a': 2}) in set(x) 
False 
>>> frozendict({'a': 2, 'b': 3}) in set(x) 
True 
+0

謝謝。我將一些代碼(我的第一個測試)添加到您的答案中以顯示使用情況 – WoJ

1

內置的機制設置的類是使用字典實現的。因此,設置元素的 要求與字典 鍵的要求相同;即該元素定義了eq()和散列()。 因此,集合不能包含可變元素,如列表或 字典。但是,它們可以包含不可變集合,如 元組或ImmutableSet的實例。

所以,如果你只想使用內置插件,你可以在他們進入一組,並將其轉換回字典,當你想使用它們你的字典轉換成元組的元組。

dict_set = set() 
dict_set.add(tuple(a_dict.items())) 
+0

這是一個很好的解決方法。但是,不能保證項目的排序(我認爲),因此您最終可能會重複輸入項目。這可以通過在那裏添加「排序」來解決。這是假設鍵和值都是可散列的(我認爲這是一個合理的假設)。 – MariusSiuram

+0

謝謝 - 我編輯了我的問題來軟化「內置」部分,我的意思是「沒有完全重寫類似集合的字典容器」。你的解決方案非常好,我對元組元素的順序有疑問(類似於@MariusSiuram) – WoJ

+1

@MariusSiuram你也可以使用'frozenset'來代替'sorted''元組。 –

0

爲一組,我只想。新增()和元素,並會知道,它只會如果它是唯一被加入。

而不是add(),使用update()|=與字典的項目。這將滿足您的加入動態和增量而目標「知道,它只會如果它是唯一可以添加」:

>>> d = dict(raymond='red') 
>>> e = dict(raymond='blue') 
>>> f = dict(raymond='red') 

>>> s = set() 
>>> s |= d.items() 
>>> s |= e.items() 
>>> s |= f.items() 
>>> s