如何将 defaultdict(Set) 转换为 defaultdict(list)?

How can I convert defaultdict(Set) to defaultdict(list)?

我有一个defaultdict(Set):

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

我想要在构建时使用 Set 功能来删除重复项。下一步我想将其存储为 json。由于 json 不支持此数据结构,我想将数据结构转换为 defaultdict(list) 但是当我尝试时:

defaultdict(list)(values)

我得到:TypeError: 'collections.defaultdict' object is not callable,我该如何转换?

您可以使用以下内容:

>>> 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 中相同的参数。在这种情况下,第二个参数是一个生成器表达式,它包含 returns 个包含键和值的元组。

请注意,如果您只需要将其存储为 JSON 普通 dict 就可以了:

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

defaultdict 构造函数的工作方式类似于 dict 构造函数,前面有一个强制性的 default_factory 参数。但是,这不会将任何现有值从集合转换为列表。如果你想这样做,你需要手动完成:

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

不过,那时您可能根本不需要 defaultdict:

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

假设 a = set(),您已经用唯一值填充了它。然后,当使用 defaultdict 时,您可以将其转换为列表:defaultdict(list(a))