为什么defaultdict为我的值创建一个数组?

Jac*_*ero 1 python collections list defaultdict

我从一组数组创建一个默认的dict:

>>> array = [['Aaron','1','2'],['Ben','3','4']]
>>> d = defaultdict(list)
>>> for i in array: d[i[0]].append({"num1":i[1],"num2":i[2]})
Run Code Online (Sandbox Code Playgroud)

我的预期结果是:

>>> d
>>> defaultdict(<type 'list'>, {'Aaron': {'num1': '1', 'num2': '2'}, 
'Ben': {'num1': '3', 'num2': '4'}})
Run Code Online (Sandbox Code Playgroud)

但我的结果是:

>>> d
>>> defaultdict(<type 'list'>, {'Aaron': [{'num1': '1', 'num2': '2'}], 
'Ben': [{'num1': '3', 'num2': '4'}]})
Run Code Online (Sandbox Code Playgroud)

就像defaultdict试图将我的值保存在数组中一样,因为这是源列表!

任何人都知道这里发生了什么以及我如何得到预期的结果?

g.d*_*d.c 9

当你这样称呼时:

d = defaultdict(list)
Run Code Online (Sandbox Code Playgroud)

这意味着如果您尝试访问d['someKey']并且它不存在,d['someKey']则通过list()不带参数调用来初始化.所以你最终会得到一个空列表,然后你可以将你的字典附加到.你可能想要这个:

d = defaultdict(dict)
Run Code Online (Sandbox Code Playgroud)

然后这个:

for i in array: 
  d[i[0]].update({"num1":i[1],"num2":i[2]})
Run Code Online (Sandbox Code Playgroud)


Sve*_*ach 8

你需要一个普通的字典,而不是defaultdict:

d = {}
for name, num1, num2 in array:
    d[name] = {"num1": num1, "num2": num2}
Run Code Online (Sandbox Code Playgroud)

或使用词典理解

d = {name: {"num1": num1, "num2": num2} for name, num1, num2 in array}
Run Code Online (Sandbox Code Playgroud)

此代码导致d存在

{'Aaron': {'num1': '1', 'num2': '2'}, 'Ben': {'num1': '3', 'num2': '4'}}
Run Code Online (Sandbox Code Playgroud)

defaultdict(list)如果您访问不存在的密钥,A将创建一个空列表.