2013-12-04 5 views
2

Итак, я сейчас работаю с mongoengine, хотя что-либо со свойствами будет иметь такое же поведение.Понимание списков Python для объединения списков (сплющено)

У меня есть список под названием . Технически это mongoengine QuerySet, который является итерируемым, но имеет практически все одинаковое поведение как список.

Каждая коллекция элементов представляет собой объект с именем addons, который также является списком.

Я хочу создать плоский список всех аддонов. В настоящее время делает это приводит к желаемому результату

addons = [] 
for col in collections: 
    addons+=col.addons 

Но когда я пытаюсь это, что я предполагаю, что это эквивалентно список понимание, я получаю список списков (она по существу присоединяет каждый список вместе вместо добавления их)

addons = [col.addons for col in collections] 

Я читал о вложенных списковых и даже с помощью itertools, но не смогли выяснить, как получить либо работать правильно

+0

Это не то же самое. Это список списков. Это список объектов, у которых есть список как один из их свойств, то есть я не могу просто выполнить вложение для циклов –

+0

Конечно, вы могли бы: '[item для col в коллекциях для элемента в col.addons]' –

ответ

1

Вы можете использовать itertools.chain.from_iterable так:

from itertools import chain 
addons = list(chain.from_iterable(col.addons for col in collections)) 

Доступно на Python> = 2.6. Раньше это было довольно быстро. Быстрее, чем понимание двойного списка.

+0

Удивительный! Это было трюк и, действительно, супер быстро. Благодаря! –

+0

@ JaredJoke вы можете отобразить его в любом случае. Модуль itertools предоставляет функцию imap, поэтому вы можете сделать список (chain.from_iterable (imap (processing_func, col.addons) для col в коллекциях))) – GrantJ

1

вам нужен двойной список понимание, как:

addons = [item for item in col.addons for col in collections] 
+0

I попробовал это и получил ошибку. UnboundLocalError: Локальная переменная 'col', на которую ссылаются перед присвоением –

+2

Вероятно, должно быть '[item для col в коллекциях для элемента в col.addons]'. 'collections' - плохое имя для переменной btw, сталкивается с именем модуля' collections'. – PaulMcG

Смежные вопросы