понимание вложенного словаря 3 уровня в Python

#python #python-3.x #dictionary #nested-loops #dictionary-comprehension

#python #python-3.x #словарь #вложенные циклы #понимание словаря

Вопрос:

У меня есть словарь 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()}
  

Но я получаю сообщение об ошибке

Ошибка имени: имя ‘vi’ не определено

Может кто-нибудь помочь мне с правильным синтаксисом для достижения этой цели?

Комментарии:

1. Порядок циклов должен быть таким же, как и во вложенных циклах, а не наоборот.

Ответ №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 / для получения подробной информации.