2017-05-25 19 views
0

私が実行したいとのforループを入れ子になりましたか?私のようなものを探しています :フラット化は、従属変数

for i, j in itertools.product(list_a, list_b[i]) 

私はスピードと読みやすさのためにそれを行うにしたいです。

your_list = [(i, j) for i in list_a for j in list_b[i]] 

その後:何もリスト内包を打つ -

+1

私はそれが速度や可読性を向上させるどのような方法でこれを平らにすることは可能だとは思わない。ネストされたアプローチは、これを行うための自然で最も効率的な方法であるように思えます。 list_b [i]]の 'jに対してlist_aのiに対して' [call_some_function(i、j)]というように、リストの理解度やジェネレータの表現として書くことで、1つの物理的な行にすべて書くことができますが、それは基本的にネストされていますforループ。 – jez

+0

でも、最も速く、リストの理解を書いて、それを関数で反復したり、何かを生成しそれを反復する関数を作成したりするのはどうですか? – Y0da

+0

リストが必要な場合は、リストの理解度を使用してください。ジェネレータ式を使用するには、ジェネレータ式を使用します: 'list_aのlist_aのiのcall_some_function(i、j)for list_b [i]'ジェネレータ式を使用します。リストをマテリアライズするメモリを浪費することなく、 do_some_more_stuff(物) ' –

答えて

1

itertoolsあなたは、ほとんどの場合、スピード(しかし、あなたに安定性を与え、可能な限りそれを使用する時間を節約できます)読みやすさと速度の両方のためとして与えることはありませんあなたが望むならそれを印刷することができます:)

+0

おかげさまで、プリントより複雑なことをしたいのなら、関数を作成してリスト(またはジェネレータ)に渡す必要があると思いますか? – Y0da

+1

あなたはその関数からの応答を収集する必要がある場合は、タプルを作成する代わりにジェネレータ内で関数を呼び出すことができます。さもなければ、ジェネレータには、1行にあり、不要な 'list'を生成する点がありません。 – zwer