【问题标题】:Nested dictionary comprehension python嵌套字典理解python
【发布时间】:2013-07-28 17:11:45
【问题描述】:

我在理解 Python 3 中的嵌套字典推导时遇到了麻烦。我从下面的示例中得到的结果输出了正确的结构而没有错误,但只包括内部键之一:值对。我还没有找到这样的嵌套字典理解示例;谷歌搜索“嵌套字典理解 python”显示遗留示例、非嵌套理解或使用不同方法解决的答案。我可能使用了错误的语法。

示例:

data = {outer_k: {inner_k: myfunc(inner_v)} for outer_k, outer_v in outer_dict.items() for inner_k, inner_v in outer_v.items()}

此示例应返回原始字典,但内部值由myfunc 修改。

outer_dict 字典的结构,以及结果:

{outer_k: {inner_k: inner_v, ...}, ...}

【问题讨论】:

    标签: python syntax nested list-comprehension dictionary-comprehension


    【解决方案1】:

    {inner_k: myfunc(inner_v)} 不是字典理解。这只是一本字典。

    您可能正在寻找类似的东西:

    data = {outer_k: {inner_k: myfunc(inner_v) for inner_k, inner_v in outer_v.items()} for outer_k, outer_v in outer_dict.items()}
    

    为了可读性,不要过多嵌套字典推导和列表推导。

    【讨论】:

    • 非常感谢 - 如果这对任何人有帮助,这里有一点让我感到困惑:Blender 的解决方案与我的前任相比有两个变化:移动括号,并将内部“for”放在外部之前。我最初正确设置了 for 子句,但是括号在错误的位置,得到“NameError:全局名称'outer_v”未定义。”然后在错误的位置与括号中的括号相同的错误正确的地方。
    【解决方案2】:

    添加一些换行符和缩进:

    data = {
        outer_k: {inner_k: myfunc(inner_v)} 
        for outer_k, outer_v in outer_dict.items()
        for inner_k, inner_v in outer_v.items()
    }
    

    ... 很明显,您实际上有一个单一的“二维”dict 理解。你真正想要的可能是:

    data = {
        outer_k: {
            inner_k: myfunc(inner_v)
            for inner_k, inner_v in outer_v.items()
        } 
        for outer_k, outer_v in outer_dict.items()
    }
    

    (这正是 Blender 在他的回答中建议的,添加了空格)。

    【讨论】:

    • 也很有帮助。我将考虑将此与在 for 循环中使用 dict comp 进行 1 轴的比较,以及从美学角度将其按行分解的最佳方法。
    • 如果outer_k键值实际上是inner_k怎么办?
    • @ZeroPiraeus 是否可以过滤特定维度。假设我有一个dict[dim1,dim2],其中'dim1=['a','b',c]' 和dim2=[1,2],我想获得一个包含dim1 和只有dim2=1 的所有值的新字典。每个值dict[dim1,dim2] 都是一个数组。我想出了[ v for k,v in dict.items() if 'a' in k],但这会返回一个二维列表,而我想要一维列表。
    【解决方案3】:
    {ok: {ik: myfunc(iv) for ik, iv in ov.items()} for ok, ov in od.items()}  
    

    在哪里
    好的外键
    ik-内键
    外值
    iv-内在价值 od-外部字典 这就是我的记忆。

    【讨论】:

      猜你喜欢
      • 2011-06-06
      • 1970-01-01
      • 2013-11-30
      • 2021-07-24
      • 2017-11-27
      • 2016-11-25
      • 2020-10-13
      • 2021-01-28
      相关资源
      最近更新 更多