2016-07-15 1 views
1

Например, этот фрагмент кода:Как использовать понимание списка с помощью метода .extend list?

out = [] 
for foo in foo_list: 
    out.extend(get_bar_list(foo)) # get_bar_list return list with some data 
return out 

Как сократить этот код, используя список понимание?

+0

Связанный, если не дублировать: http://stackoverflow.com/q/952914/1639625 –

+2

@parsenz Нет, потому что это создаст список списка, в то время как OP ищет список сглаживания. – Delgan

ответ

6

Вы можете использовать выражение генератора и потребляют его itertools.chain:

from itertools import chain 

out = list(chain.from_iterable(get_bar_list(foo) for foo in foo_list)) 
1

Если длина списков невелика, вы можете сделать это с суммированием выражения генератора вместо:

sum((get_bar_list(foo) for foo in foo_list), []) 

nested list comprehension является более эффективным, но менее читаемым.

+0

Я бы не посоветовал это вообще, если вы не знаете, что у вас небольшие списки. Для больших списков сложность времени N^2 даст вам ... – mgilson

+0

Да, истинное, вложенное понимание списка лучше для больших данных. Добавлено примечание об этом. – wim

4

Вы можете использовать вложенную-список понимание:

out = [foo for sub_item in foo_list for foo in get_bar_list(sub_item)] 

FWIW, у меня всегда есть трудное время вспомнить точно, какие вещи подходят для вложенных списков и поэтому я обычно предпочитаю использовать itertools.chain (как упоминалось в ответе Моисея). Тем не менее, если вы действительно любите вложенные список-постижения, порядок такой же, как вы бы столкнуться с ними в нормальном цикле (с переменной внутренней петлей для первого выражения в списке понимании):

for sub_item in foo_list: 
    for foo in get_bar_list(sub_item): 
     out.append(foo)