Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでリスト内のタプルを反復処理して1つのリストに変換する3つの方法

リストはPythonプログラミングにおいて最も重要なデータ構造の一つであり、日常的なスクリプト作成からWeb開発まで、ほぼすべてのコードで利用されています。使用頻度が高いだけに、その操作をマスターすることは開発者にとって必須のスキルです。

本記事では、リストの中にさらにリスト(タプル)が格納された入れ子構造を反復処理し、全要素を1つのフラットなリストとして取り出す方法を、3つの異なるアプローチで解説します。

今回扱うサンプルデータは以下の通りです。

test_list = [
[('11'), ('12'), ('13')],
[('21'), ('22'), ('23')],
[('31'), ('32'), ('33')]
]

方法1:itertools.zip_longest を使う

標準ライブラリitertoolsのzip_longest()関数を使うと、複数のサブリストを縦方向(列単位)に束ねて反復できます。各サブリストの同じ位置にある要素が順に取り出されるため、結果は列優先の順序になります。

# itertools.zip_longest を使う方法
from itertools import zip_longest

# 入れ子のリストを初期化
test_list = [
[('11'), ('12'), ('13')],
[('21'), ('22'), ('23')],
[('31'), ('32'), ('33')]
]

# 初期リストを表示
print('Initial List = ', test_list)

# 縦方向に反復して1つのリストへ変換
res_list = [item for my_list in zip_longest(*test_list)
for item in my_list if item]

# 結果を表示
print('Resultant List = ', res_list)

実行結果

Initial List = [['11', '12', '13'], ['21', '22', '23'], ['31', '32', '33']]
Resultant List = ['11', '21', '31', '12', '22', '32', '13', '23', '33']

zip_longest(*test_list)と書くことで、各サブリストのn番目の要素同士がグループ化されます。条件式if itemは、サブリストの長さが不揃いな場合に生じるNoneや空の要素を除外するフィルタとして機能します。

方法2:zip_longest + lambda + chain + filter を使う

より関数型らしいアプローチとして、chain()でイテレータを連結し、filter()lambdaで空要素を除去する方法もあります。

# zip_longest + lambda + chain + filter を使う方法
from itertools import zip_longest, chain

# 入れ子のリストを初期化
test_list = [
[('11'), ('12'), ('13')],
[('21'), ('22'), ('23')],
[('31'), ('32'), ('33')]
]

# 初期リストを表示
print('Initial List = ', test_list)

# chainで連結し、lambdaで空要素を除外してリスト化
res_list = list(filter(lambda x: x, chain(*zip_longest(*test_list))))

# 結果を表示
print('Resultant List = ', res_list)

実行結果

Initial List = [['11', '12', '13'], ['21', '22', '23'], ['31', '32', '33']]
Resultant List = ['11', '21', '31', '12', '22', '32', '13', '23', '33']

処理の流れとしては、まずzip_longest(*test_list)で列ごとの要素群を生成し、chain()でそれらを一続きのイテレータに連結、最後にfilter(lambda x: x, ...)でNoneなどの偽値を取り除いています。

方法3:リスト内包表記を使う

最もシンプルでPythonicなのがリスト内包表記です。追加のimportも不要で、行優先の順序で要素を取り出せます。

# リスト内包表記を使う方法
# 入れ子のリストを初期化
test_list = [
[('11'), ('12'), ('13')],
[('21'), ('22'), ('23')],
[('31'), ('32'), ('33')]
]

# 初期リストを表示
print('Initial List = ', test_list)

# 内包表記でフラット化
res_list = [item for list2 in test_list for item in list2]

# 結果を表示
print('Resultant List = ', res_list)

実行結果

Initial List = [['11', '12', '13'], ['21', '22', '23'], ['31', '32', '33']]
Resultant List = ['11', '12', '13', '21', '22', '23', '31', '32', '33']

まとめ:使い分けのポイント

  • 単純に平坦化したい場合:リスト内包表記が最も簡潔で読みやすい
  • 列ごと(縦方向)に要素を取得したい場合zip_longest()が有効
  • サブリストの長さが不揃いな場合:通常のzip()では最短の長さに切り詰められますが、zip_longest()なら欠損をNoneとして埋めながら処理できる
  • 関数型スタイルを好む場合chain()filter()の組み合わせも選択肢の一つ

目的やデータ構造に応じて適切な方法を選び、可読性の高いコードを心がけましょう。

  1. Pythonでリストを定義する方法とは?基本の書き方を初心者向けに解説

    リスト(List)は、Pythonにおける基本的なシーケンス型データ構造の一つです。複数の要素を角括弧 [ ] で囲み、カンマで区切って表現します。各要素は文字列や数値など異なるデータ型が混在していても問題ありません。また、リストは順序付き(ordered)コレクションであるため、格納した要素の並び順は保持されます。個々の要素には、0から始まるインデックスを使ってアクセスできます。たとえば最初の要素はインデックス 0、2番目の要素は 1 で参照します。リストの定義例list1 = [physics, chemistry, 1997, 2000] list2 = [1, 2, 3, 4, 5]

  2. Pythonリスト入門:作成から操作、削除まで徹底解説

    このチュートリアルでは、Pythonのリスト(List)について学びます。リストの作成方法、要素へのアクセス、要素の追加・削除、リスト自体の削除など、基本的な操作を一つずつ丁寧に解説していきます。 Pythonでは、リストは角括弧 [] を使って構築し、各要素はカンマ , で区切って記述します。 Pythonのリストは、異なる型のオブジェクトを混在させて格納できるのが特徴です。すべて文字列である必要も、整数である必要もありません。例えば、以下のように複数の型が混ざったリストを作成できます。mixedTypesList = [a, True, 1, 1.0] リストの作成方法 リストは、角括弧