2016-07-15 45 views
1

例如,这个片段:如何使用.extend列表方法使用列表理解?

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)