【问题标题】:Is it possible to have nested dictionary using setdefault, appending to a list?是否可以使用 setdefault 嵌套字典,附加到列表中?
【发布时间】:2019-04-17 06:10:06
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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. 我们在ret 键中寻找row[0]。如果它不存在,我们将(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,以便在需要时创建新容器。

    【讨论】:

    • 谢谢老兄!我已经知道了,但是有人删除了我的答案。 ): 习惯了这里的规则。尽管如此,还是非常感谢你,你的解释让我看得更清楚了。
    • @Susan 很高兴为您提供帮助!顺便说一句,不禁止回答您自己的问题。我不知道为什么你的答案被删除了。检查the rules
    【解决方案2】:

    让我们按照 for 循环块中的语句进行操作。

    第一个是:

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

    这将为密钥row[1] 设置一个值{row[0]: []}字典),其中密钥尚未插入month

    下一个语句是:

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

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

    那一行应该写成:

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

    month[row[1]] 检索与键 row[1] 配对的 字典,然后将其编入索引以访问与 row[0] 配对的列表。

    【讨论】:

    • 我明白了,它仍然给我同样的错误。我想设置固定键,以便为两个键设置默认值。尽管如此,还是非常感谢!
    • 我应该清楚地说明我的愿望输出,我的错。
    猜你喜欢
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2021-06-08
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多