2016-05-13 119 views
3

我有一個defaultdict(Set)如何將defaultdict(Set)轉換爲defaultdict(list)?

from sets import Set 
from collections import defaultdict 
values = defaultdict(Set) 

我想設置的功能,以消除重複建設起來的時候。下一步我想將此存儲爲json。由於JSON不支持這種數據結構,我想對數據結構轉換爲defaultdict(list)但是當我嘗試:

defaultdict(list)(values) 

我得到:TypeError: 'collections.defaultdict' object is not callable,我應該怎麼做轉換?

+1

'from sets import Set' - Python現在已經改進了'set'類型,現在您不需要導入。你應該停止使用舊的'sets.Set'。 – user2357112

回答

3

您可以使用下面:

>>> values = defaultdict(Set) 
>>> values['a'].add(1) 
>>> defaultdict(list, ((k, list(v)) for k, v in values.items())) 
defaultdict(<type 'list'>, {'a': [1]}) 

defaultdict構造函數採用default_factory作爲可以跟隨相同的參數在正常dict第一個參數。在這種情況下,第二個參數是一個生成器表達式,它返回包含鍵和值的元組。

請注意,如果你只需要其存儲爲JSON正常dict會做得很好:

>>> {k: list(v) for k, v in values.items()} 
{'a': [1]} 
+2

jonalv可能不需要這裏的defaultdict功能。你可以使用更簡單的詞典理解: 'new_values = {k:list(v)for k,v in values.items()}' –

+0

@LeviNoecker好點,補充說回答 – niemmi

3
defaultdict(list, values) 

的defaultdict構造就像在前面的強制性default_factory參數的構造函數字典。但是,這不會將集合中的任何現有值轉換爲列表。如果你想做到這一點,你需要做手工:

defaultdict(list, ((k, list(v)) for k, v in values.viewitems())) 

你可能甚至不希望defaultdict都在這一點上,雖然:

{k: list(v) for k, v in values.viewitems()} 
+2

這會讓每個現有的條目作爲「集合」。 –

+0

@JaredGoguen:是的,我正在編輯中,以解決這個問題。 – user2357112

0

我不知道我確切地理解因爲我不熟悉舊的from sets import Set功能。難道你不能只是做到以下幾點:

說那a = set(),你已經用獨特的價值填充它。然後,在使用defaultdict時,您可以將它轉換爲列表:defaultdict(list(a))