Сглаживание мелкого списка в Python

| | | | | | | | | | | | | |

Есть ли простой способ сгладить список итерируемых объектов с помощью понимания списка, или, если это не удастся, что вы все считаете лучшим способом сгладить такой неглубокий список, сбалансировав производительность и удобочитаемость?

Я попытался сгладить такой список с помощью вложенного понимания списка, например так:

[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]