Python中的嵌套字典推导式

39
我对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, ...}, ...}
3个回答

58

{inner_k: myfunc(inner_v) for inner_k, inner_v in mydict.items()} 这并不是字典理解(dictionary comprehension)而仅仅是一个字典。

你可能想要的是这样:

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

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


1
非常感谢 - 如果这对任何人有帮助,这里有一个让我困惑的点:Blender的解决方案与我的以前有两个变化:移动了一个括号,并将内部的“for”放在外层之前。我最初已经正确设置了for语句,但由于括号位置不正确,出现了“NameError: global name 'outer_v'未定义。” 然后,在正确放置括号时,'for's 的位置错误会出现相同的错误。 - Turtles Are Cute

50

添加一些换行和缩进:

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

... 显然你实际上有一个单一的“二维”字典推导式。你实际想要的可能是:

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


1
也非常有帮助。我会研究一下将其与在for循环中使用字典推导式进行1轴比较的方法,以及最好的方式如何在视觉上分行。 - Turtles Are Cute
如果outer_k键的值实际上是inner_k,会怎样呢? - Michael
@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],但这会返回一个二维列表,而我想要一个一维列表。 - Alexander Cska

7
{ok: {ik: myfunc(iv) for ik, iv in ov.items()} for ok, ov in od.items()}  

where
ok-外部键
ik-内部键
ov-外部值
iv-内部值
od-外部字典(outer dictionary)
这就是我记忆中的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接