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

4

我有一个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,我应该怎么做才能解决它?

1
Python现在有一个改进的set类型,无需导入即可使用。您应该停止使用旧的sets.Set - user2357112
3个回答

6
您可以使用以下内容:
>>> 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()} - Levi Noecker

3
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()}

2
这将保留每个现有条目作为一个“集合”。 - Jared Goguen
@JaredGoguen:是的,我正在编辑中以解决这个问题。 - user2357112

0
假设你已经创建了一个空的集合 a = set(),并且已经向其中添加了一些唯一的值。那么,在使用 defaultdict 时,你可以将其转换为列表:defaultdict(list(a))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接