2016-07-15 82 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)