需要一个defaultdict,其中值为两个列表

5
在Python中,我想要类似于

这样的东西。
dict = defaultdict((list,list))

我希望对于每个键,都有两个列表。

在上面的代码片段中,我得到了错误“第一个参数必须是可调用的”。我该怎么做才能实现这个功能?


@Austin,这会让代码变得有点凌乱,因为在每次插入新键之后,我都需要先附加两个列表.. 这里还需要额外的if检查.. - midi
2个回答

3

将创建空列表的函数作为参数传递给defaultdict

from collections import defaultdict

def pair_of_lists():
    return [[], []]

d = defaultdict(pair_of_lists)

d[1][0].append(3)
d[1][1].append(42)

print(d)
# defaultdict(<function pair_of_lists at 0x7f584a40b0d0>, {1: [[3], [42]]})

0

它不是某种类型推断,你只需要提供一个生成默认值的函数。当没有参数时,intlistdict 会生成 0[]{},这在 defaultdict 声明中经常被利用。Python 没有对列表等的一对构造函数的内置支持。所以这就像

di = defaultdict(lambda : ([1,2,3], ['a', 'cb']))

虽然Python允许使用列表的元组(对),但您可能会遇到一些问题,例如关于列表元组的哈希计算。为了保险起见,您可以将默认值设置为两个列表的列表。请注意,您设置的是具体的列表,无论是空还是非空,而不是列表类型/构造函数。这实际上是关于设置默认值,而不是类型声明 - Python列表是无类型的。
from collections import defaultdict
l1 = []
l2 = ["another", "default", "list"]
di = defaultdict(lambda : [ l1, l2] )
print (di[3])

奇怪的是,dict['This'][0].append(1) 不起作用!我错了什么? - midi
这个可以工作:dict = defaultdict(lambda : [[], []]),但是这个不行:dict = defaultdict(lambda : [list, list])。无法弄清楚为什么会这样。 - midi
1
在 @midi 中,当你写 list 时,它不会被调用,所以你应该写成 [] 或者 list() - N Chauhan

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