2012-11-29 5 views
5

リスト(または辞書)内の関数の復帰をテストする方法はありますか?私はそれを書くことを避けたい:Pythonのリストの理解:テスト関数の戻り

lst = [] 
for x in range(10): 
    bar = foo(x) 
    if bar: 
    lst.append(bar) 

代わりにリストの理解を使用してください。明らかに、私は書いたくありません:

[foo(x) for x in range(10) if foo(x)] 

so?およそ

filter(None, map(foo, range(10))) 

あなたはitertools.imap()map()を置き換え、中間リストを保持したくない場合はどう

[foo(x) for x in range(10) if ??? ] 
+1

あなたが最初の方法を使用したくないのはなぜ?それは適切な方法です。 –

+0

@Rohit Jain - 'foo'に応じて、2回したくない高価な操作になる可能性があります。 – mgilson

+1

@mgilson:最初の例では、彼は一度だけそれをします。 –

答えて

10

。そしてitertools.ifilter()で、すべてのものが発電機に変わる可能性があります。

itertools.ifilter(None, itertools.imap(foo, range(10))) 
+1

私はいつもfilter'は同様に1つの引数の形式を取る必要があります 'のように感じ... – mgilson

+1

かではなく、 'imap'では、genexp:' filter(range(10)のxはfoo(x)なし)を使用できます)) ' – mgilson

+0

確かに素晴らしい解決策です。 – Adrien

5

ジェネレータを作成して値を計算し、後でジェネレータからフィルタリングされたリストを作成します。

例:参考

# create generator via generator expression 
results = (foo(x) for x in xrange(10)) 
# build result list, not including falsy values 
filtered_results = [i for i in results if i] 

関連する問題