【问题标题】:Why is defaultdict creating an array for my values?为什么 defaultdict 为我的值创建一个数组?
【发布时间】:2012-03-29 15:17:16
【问题描述】:

我正在从数组数组中创建一个默认字典:

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

我的预期结果是:

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

但我的结果是:

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

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

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

【问题讨论】:

  • 因为你要求它;)
  • @delnan 我怀疑“列表”可能是问题所在。一旦出于完整性考虑,我将发布正确的代码。谢谢

标签: python list collections defaultdict


【解决方案1】:

当你调用它时:

d = defaultdict(list)

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

d = defaultdict(dict)

然后是这个:

for a, b, c in array: 
  d[a].update({"num1": b, "num2": c})

【讨论】:

    【解决方案2】:

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

    d = {}
    for name, num1, num2 in array:
        d[name] = {"num1": num1, "num2": num2}
    

    或使用字典理解

    d = {name: {"num1": num1, "num2": num2} for name, num1, num2 in array}
    

    此代码导致d 存在

    {'Aaron': {'num1': '1', 'num2': '2'}, 'Ben': {'num1': '3', 'num2': '4'}}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 2015-10-01
      • 2015-02-27
      • 2021-10-16
      • 2019-12-05
      • 2011-07-19
      • 2012-07-23
      相关资源
      最近更新 更多