是否可以使用setdefault将嵌套字典添加到列表中?

时间:2019-04-17 06:10:07

标签: python python-3.x list dictionary setdefault

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

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]]}}

2 个答案:

答案 0 :(得分: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()

通常,value_if_absent是容器,funcappendextendupdate等方法之一。但是func也可以是setdefault,以便在需要时创建新容器。

答案 1 :(得分:0)

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

第一个是:

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

这将为尚未插入{row[0]: []}的密钥row[1]设置month dictionary )的值。

下一条语句是:

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

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

该行应写为:

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

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