0

我想要一个嵌套字典,其中包含附加到子键的值列表。无法让子密钥识别。

month = {}
    for row in date:
        month.setdefault(row[1],{row[0]: []})
        month[row[0]].append(row[4])

print(month[main_key][sub_key])

我希望通过附加方法填充值列表。但是,我不断收到 keyError。

所需的输出:

{'row[1]': {'row[0]' :[row[4], row[4], row[4]],
            'row[0]' :[row[4], row[4], row[4]]}}
4

2 回答 2

1

这是我认为您正在努力实现的一个简单示例:

>>> rows = [[1,2,3], [1,2,4], [1,3,3], [1,3,5], [2,3,9], [2,3,5]]
>>> ret = {}
>>> for row in rows:
...     ret.setdefault(row[0], {}).setdefault(row[1], []).append(row[2])
...
>>> ret
{1: {2: [3, 4], 3: [3, 5]}, 2: {3: [9, 5]}}

它是如何工作的?对于每个row

  1. 找钥匙row[0]。_ ret如果它不存在,我们将它添加(row[0], {})到字典中,{}作为嵌套字典。它存在,我们继续。
  2. 该值row[1]是嵌套字典的键。我们在ret[row[0]](第一次setdefault返回)中查找它:如果它不存在,我们添加一个空列表。
  3. 我们将值添加row[2]到列表中ret[row[0]][row[1]]

请记住:

ret.setdefault(row[0], value_if_absent).func()

方法:

if row[0] not in ret:
    ret[row[0]] = value_if_absent

ret[row[0]].func()

Usaully,value_if_absent是一个容器,funcappend, extend, update, ... 方法之一。但如果需要,func也可以setdefault创建一个新容器。

于 2019-04-17T15:31:21.850 回答
0

让我们遵循 for 循环块中的语句。

第一个是:

month.setdefault(row[1], {row[0]: []})

这将为未插入键的键设置一个值{row[0]: []}字典)。row[1]month

下一个声明是:

month[row[0]].append(row[4])

它附加row[4]month使用 key检索的列表row[0]。考虑到即使键存在于 中month,此行也应该出错,与之配对的值是字典而不是列表。

该行应写为:

month[row[1]][row[0]].append(row[4])

month[row[1]]检索与 key 配对的字典row[1],然后对其进行索引以访问与 配对的列表row[0]

于 2019-04-17T07:22:17.470 回答