Самое близкое, что я могу сделать, - это предоставить «фальшивый» второй уровень при необходимости и игнорировать его впоследствии:
mydictlist = [{'name':'foo'}, {'name':'bar','next-level':[{'name':'next-level-foo'}, {'name':'next-level-bar'}] } ]
flattened = [ '{}_{}'.format(item['name'],next['name']) if next['name'] else item['name'] for item in mydictlist for next in (item['next-level'] if 'next-level' in item else [{'name':None}]) ]
Вывод:
['foo', 'bar_next-level-foo', 'bar_next-level-bar']
Кажется, нет способа условного цикла в понимании списка. Поэтому, если есть два for
-s, они оба будут выполняться, но «субъект» второго цикла может быть сгенерирован условно (изначально я делал это с помощью лямбды, но, видимо, выражения в скобках вполне достаточно).
В вашей попытке произошла ошибка, for next in iter
должно было быть for next in iter['next-level']
(также iter()
- встроенная функция, поэтому я переименовал ее в item
).
И если вы что-то пробовалименее амбициозный, вы бы столкнулись с явным сообщением об ошибке: повторяемая распаковка не может быть использована в понимании .