リスト内包表記を使用して反復可能リストをフラット化する簡単な方法はありますか、それとも失敗した場合、パフォーマンスと読みやすさのバランスを取りながら、このような浅いリストをフラット化するための最良の方法は何だと思いますか?
次のように、ネストされたリスト内包表記を使用してこのようなリストをフラット化しようとしました。
[list_of_menuitemsのmenuitemのmenuitemの画像の画像]
しかし、 name "menuitem"が定義されていないため、
。スタックオーバーフローをグーグルで調べた後、 NameError
の種類に問題があります reduce
ステートメントで目的の結果が得られました。
reduce(list .__ add __、map(lambda x:list(x )、list_of_menuitems))
しかし、xはDjango QuerySet list(x)
を呼び出す必要があるため、このメソッドはかなり読みにくくなっています。 code>オブジェクト。
結論:
この質問に貢献してくれたすべての人に感謝します。これが私が学んだことの要約です。また、他の人がこれらの観察結果を追加または修正したい場合に備えて、これをコミュニティwikiにします。
元のreduceステートメントは冗長であり、次のように記述した方がよいでしょう:
>>> reduce(list .__ add __、(list(mi)for mi in list_of_menuitems))
これは、ネストされたリスト内包表記の正しい構文です(すばらしい要約 dF !):
>>> [image for mi in list_of_menuitems for image in mi]
しかし、これらの方法はどちらも itertools.chain
を使用するほど効率的ではありません。
>>&gt ; itertools import chainから>>> list(chain(* list_of_menuitems))
そして@cdlearyのメモとして、<を使用して*演算子の魔法を避ける方がおそらく良いスタイルです。 code> chain.from_iterable のように:
&gt;&gt;&gt; chain = itertools.chain.from_iterable([[1,2]、[3]、[5,89]、[]、[6]])&gt;&gt;&gt; print(list(chain))&gt;&gt;&gt; [1、2、3、5、89、6]