Pythonでリストのリストを平坦化する方法
Emily Parker
Product Engineer · Leapcell

Key Takeaways
- リスト内包表記または
itertools.chain()
を使用するのが、最も簡潔で効率的なアプローチです。 flatten_recursive()
は、任意のレベルのネストを持つリストを処理できます。- メソッドの選択は、リストの構造とパフォーマンス要件によって異なります。
Pythonでリストのリストを平坦化するには、ネストされたリスト構造を単一の1次元リストに変換します。これは、行列やJSONデータなど、ネストされたリストに格納されたデータを扱う場合の一般的なタスクです。以下に、これを実現するためのいくつかの方法を示します。それぞれに独自の利点があります。
1. Forループと .extend()
の使用
この方法は、各サブリストを反復処理し、新しいリストを各サブリストの要素で拡張します。
def flatten_extend(nested_list): flat_list = [] for sublist in nested_list: flat_list.extend(sublist) return flat_list
このアプローチは率直で読みやすく、初心者にも適しています。
2. リスト内包表記の使用
リスト内包表記は、リストのリストを平坦化するための簡潔な方法を提供します。
def flatten_comprehension(nested_list): return [item for sublist in nested_list for item in sublist]
この1行のコードは効率的で、Pythonicなコードベースで広く使用されています。
3. itertools.chain()
の使用
itertools
モジュールは、リストのリストを平坦化するために使用できるchain()
関数を提供します。
import itertools def flatten_chain(nested_list): return list(itertools.chain.from_iterable(nested_list))
このメソッドは効率的で、ネストされたループのオーバーヘッドを回避するため、大規模なデータセットに適しています。
4. functools.reduce()
の使用
functools
モジュールのreduce()
関数は、サブリストを単一のリストに連結できます。
from functools import reduce from operator import add def flatten_reduce(nested_list): return reduce(add, nested_list, [])
このアプローチは機能しますが、一般的に読みにくく、単純な平坦化タスクには推奨されません。
5. sum()
の使用
組み込みのsum()
関数は、空のリストを開始値として指定することで、リストのリストを平坦化することもできます。
def flatten_sum(nested_list): return sum(nested_list, [])
このメソッドは簡潔ですが、sum()
がリストの連結を処理する方法により、大規模なリストでは効率が低下する可能性があります。
6. 深くネストされたリストに対する再帰の使用
任意のレベルのネストを持つリストの場合、再帰的なアプローチを使用できます。
def flatten_recursive(nested_list): flat_list = [] for item in nested_list: if isinstance(item, list): flat_list.extend(flatten_recursive(item)) else: flat_list.append(item) return flat_list
このメソッドは、任意の深さのネストされたリストを処理しますが、最大再帰深度エラーを回避するために注意して使用する必要があります。
7. 数値データに対するNumPyの使用
数値データを扱っている場合、NumPyは配列を平坦化するための効率的なメソッドを提供します。
import numpy as np def flatten_numpy(nested_list): return np.array(nested_list).flatten().tolist()
このアプローチは数値計算に非常に効率的であり、データサイエンスアプリケーションで一般的に使用されます。
結論
各メソッドには独自のユースケースがあります。
- Forループとリスト内包表記: 可読性と簡潔さに最適です。
itertools.chain()
: 大規模なデータセットに効率的です。reduce()
とsum()
: 簡潔ですが、パフォーマンス上の欠点がある可能性があります。- 再帰: 深くネストされたリストに適しています。
- NumPy: 数値データ処理に最適です。
特定のニーズとデータの性質に最適な方法を選択してください。
FAQs
リスト内包表記を使用します: [item for sublist in nested_list for item in sublist]
。
再帰的な方法(flatten_recursive
)のみが、任意の深さのネストを処理できます。
より良いパフォーマンスのために、数値データを扱う場合はNumPyを使用してください。
Leapcellは、Pythonプロジェクトをホストするための最適な選択肢です。
Leapcellは、Webホスティング、非同期タスク、およびRedis向けの次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、Rustで開発できます。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ料金が発生します。リクエストや料金は発生しません。
比類のない費用対効果
- アイドル料金なしの従量課金制。
- 例:25ドルで、平均応答時間60ミリ秒で694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムメトリックとロギング。
簡単なスケーラビリティと高性能
- 高い並行性を容易に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ — 構築に集中できます。
ドキュメントで詳細をご覧ください!
Xでフォローしてください:@LeapcellHQ