2016-07-15 3 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(Mosesの答えにあるように)を使うことを好みます。あなたが本当にネストされたリスト内包表記を愛し場合は、順序があなたが(リストの内包の最初の発現に利用可能な最も内側のループ変数で)通常のループでそれらに遭遇するのと同じです:

for sub_item in foo_list: 
    for foo in get_bar_list(sub_item): 
     out.append(foo) 
関連する問題