30

我在理解 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, ...}, ...}
4

3 回答 3

46

{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()}

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

于 2013-07-29T02:17:46.430 回答
39

添加一些换行符和缩进:

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 在他的回答中建议的,添加了空格)。

于 2013-07-29T02:26:49.390 回答
6
{ok: {ik: myfunc(iv) for ik, iv in ov.items()} for ok, ov in od.items()}  

where
ok-outer key
ik-inner key
ov-outer value
iv-inner value od-outer dictionary 这就是我的记忆。

于 2018-12-26T11:44:19.560 回答