Есть ли простой способ сгладить список итерируемых объектов с помощью понимания списка, или, если это не удастся, что вы все считаете лучшим способом сгладить такой неглубокий список, сбалансировав производительность и удобочитаемость?
Я попытался сгладить такой список с помощью вложенного понимания списка, например так:
[image for image in menuitem for menuitem in list_of_menuitems]
Но у меня возникают проблемы с разновидностью NameError
, потому что имя "menuitem" не определено
. Погуглив и просмотрев Stack Overflow, я получил желаемые результаты с помощью инструкции reduce
:
reduce(list.__add__, map(lambda x: list(x ), list_of_menuitems))
Но этот метод довольно нечитаем, потому что мне нужен этот вызов list(x)
, потому что x является Django QuerySet
объект.
Заключение:
Спасибо всем, кто внес свой вклад в этот вопрос. Вот краткое изложение того, что я узнал. Я также делаю это вики сообщества на случай, если другие захотят добавить или исправить эти наблюдения.
Мой исходный оператор сокращения является избыточным, и его лучше написать так:
>>> reduce(list.__add__, (list(mi) for mi in list_of_menuitems))
Это правильный синтаксис для понимания вложенного списка (Великолепное резюме dF!):
>>> [изображение для ми в list_of_menuitems для изображения in mi]
Но ни один из этих методов не так эффективен, как использование itertools.chain
:
>>> ; from itertools import chain >>> list(chain(*list_of_menuitems))
И, как отмечает @cdleary, вероятно, лучше избегать магии операторов *, используя chain.from_iterable
примерно так:
>>> chain = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]]) >>> печать(список(цепочка)) >>> [1, 2, 3, 5, 89, 6]