【问题标题】:3 level nested dictionary comprehension in PythonPython中的3级嵌套字典理解
【发布时间】:2021-01-28 20:38:14
【问题描述】:

我有一个 Python 字典如下:

d = {'1': {'1': 3, '2': 1, '3': 1, '4': 4, '5': 2, '6': 3},
     '2': {'1': 3, '2': 3, '3': 1, '4': 2},
     '3': {'1': 1, '2': 1, '3': 3, '4': 2, '5': 1, '6': 1, '7': 1},
     '4': {'1': 1, '2': 1, '3': 3, '4': 2, '5': 1, '6': 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, ki, i) for i in range(vi) for ki, vi in vo.items() for ko, vo in d.items()}

但我得到一个错误

NameError: name 'vi' 未定义

有人可以帮助我使用正确的语法来实现这一点吗?

【问题讨论】:

  • 循环的顺序应该和你的嵌套循环一样,不能颠倒。

标签: python python-3.x dictionary nested-loops dictionary-comprehension


【解决方案1】:

循环的顺序必须颠倒。

这就是你要找的东西:

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

【讨论】:

    【解决方案2】:

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

    详情请见https://treyhunner.com/2015/12/python-list-comprehensions-now-in-color/

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 1970-01-01
      • 2013-07-28
      • 2011-06-06
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 2013-11-30
      相关资源
      最近更新 更多