Python中的3级嵌套字典理解

问题描述

我有一个Python字典,如下所示:

d = {'1': {'1': 3,'2': 1,'3': 1,'4': 4,'5': 2,'6': 3},'2': {'1': 3,'2': 3,'4': 2},'3': {'1': 1,'3': 3,'4': 2,'5': 1,'6': 1,'7': 1},'4': {'1': 1,'7': 1}}

我对字典有此操作:

D = {}
for ko,vo in d.items():
  for ki,vi in vo.items():
    for i in range(vi):
      D[f'{ko}_{ki}_{i}'] = someFunc(ko,ki,i)

我想将其翻译成具有字典理解力的一个衬里,如下所示:

D = {f'{ko}_{ki}_{i}': someFunc(ko,i) for i in range(vi) for ki,vi in vo.items() for ko,vo in d.items()}

但是我得到一个错误

NameError:未定义名称'vi'

有人可以帮助我以正确的语法实现这一目标吗?

解决方法

循环的顺序必须颠倒。

这是您要寻找的:

D = {f'{ko}_{ki}_{i}': someFunc(ko,ki,i) for ko,vo in d.items() for ki,vi in vo.items() for i in range(vi)  }
,

列表理解中的for子句应以与相同的for循环代码相同的顺序出现。唯一可以“移动”的是,最里面的赋值被开头的表达式替换。

有关详细信息,请参见https://treyhunner.com/2015/12/python-list-comprehensions-now-in-color/