2016-05-13 68 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))