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