[解決済み] Pythonで浅いリストを平坦にする [重複] [重複
質問
リスト内包で反復可能なリストを平坦化する簡単な方法はありますか?あるいは、そうでない場合、パフォーマンスと可読性のバランスを取りながら、このような浅いリストを平坦化する最善の方法を皆さんはどうお考えでしょうか?
このようなリストをネストしたリスト内包で平坦化しようとすると、次のようになります。
[image for image in menuitem for menuitem in list_of_menuitems]
しかし、私は
NameError
というのは
name 'menuitem' is not defined
. ググったり、Stack Overflowで調べたりした結果、期待通りの結果を得ることができたのは
reduce
ステートメントを使用します。
reduce(list.__add__, map(lambda x: list(x), list_of_menuitems))
しかし、このメソッドはかなり読みにくいです。
list(x)
の呼び出しは、x が Django の
QuerySet
オブジェクトを作成します。
結論 :
この質問に投稿してくれた皆さん、ありがとうございました。 以下は、私が学んだことをまとめたものです。 また、他の人がこれらの観察に追加したり修正したりしたい場合に備えて、これをコミュニティWikiにしています。
私のオリジナルのreduce文は冗長なので、このように書いた方がよいでしょう。
>>> reduce(list.__add__, (list(mi) for mi in list_of_menuitems))
これは、ネストされたリスト内包の正しい構文です(Brilliant summary dF !):
>>> [image for mi in list_of_menuitems for image in mi]
しかし、これらの方法は、どちらも
itertools.chain
:
>>> from itertools import chain
>>> list(chain(*list_of_menuitems))
また、@cdleary が指摘しているように、 * 演算子マジックを避けるためには、おそらく
chain.from_iterable
というように。
>>> chain = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]])
>>> print(list(chain))
>>> [1, 2, 3, 5, 89, 6]
解決方法は?
もし、データ構造の平坦化されたバージョンを反復処理したいだけで、インデックス可能なシーケンスは必要ないのであれば、次のことを検討してみてください。 itertools.chainと会社 .
>>> list_of_menuitems = [['image00', 'image01'], ['image10'], []]
>>> import itertools
>>> chain = itertools.chain(*list_of_menuitems)
>>> print(list(chain))
['image00', 'image01', 'image10']
これは反復可能なものであれば何でも動作します。
QuerySet
を使用しているようですね。
編集する
なぜなら、reduceは拡張されるリストに項目をコピーするのと同じオーバーヘッドが発生するからです。
chain
を実行した場合のみ、この(同じ)オーバーヘッドが発生します。
list(chain)
を最後に記述します。
メタ編集です。 実際には、オリジナルをテンポラリで拡張する際に作成したテンポラリリストを捨てるので、質問の解決案よりもオーバーヘッドが少なくなります。
編集する
として
J.F.セバスチャンのコメント
itertools.chain.from_iterable
は解凍を避けるので、それを使って
*
のマジックがありますが
timeitアプリ
は、パフォーマンスの差はごくわずかであることがわかります。
関連
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] リストが空かどうかを確認するにはどうすればよいですか?
-
[解決済み] リスト内包のif/else
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
Python百行で韓服サークルの画像クロールを実現する
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】なぜ「LinAlgError: Grangercausalitytestsから「Singular matrix」と表示されるのはなぜですか?
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] リストのリストからフラットなリストを作るには?