Pythonのリスト内包表記とは?

Pythonのリスト内包表記(List comprehensions)は、リストを簡潔に作成するための便利な構文です。従来のforループや関数を使ったリスト生成よりも短く書けるため、コードがスッキリし、可読性が向上します。また、処理も効率的に行えるため、パフォーマンスが向上するケースも多いです。

基本構文

リスト内包表記の基本的な構文は次のようになります。

[for 変数 in イテラブル]

この構文は、forループを使ってイテラブル(リストやタプル、レンジなど)から要素を取り出し、その要素に対して何らかの処理を行い、その結果をリストとして返すものです。

例:数値リストの作成

# 0から9までのリストを作成する
numbers = [x for x in range(10)]
print(numbers)  # 出力: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

この例では、range(10)を使って0から9までの数値を生成し、それをリストに変換しています。通常のforループで書く場合よりも、コードが簡潔に表現されています。

リスト内包表記に条件を追加する

リスト内包表記は、if文を使って特定の条件を満たす要素だけをリストに含めることもできます。この機能により、条件に基づいたリスト作成が非常に簡単になります。

例:偶数のみのリストを作成する

# 0から9までの偶数リストを作成
even_numbers = [x for x in range(10) if x % 2 == 0]
print(even_numbers)  # 出力: [0, 2, 4, 6, 8]

この場合、if文を使ってx % 2 == 0、つまり偶数のみをリストに追加しています。

ネストされたループの使用

リスト内包表記では、ネストされたforループもサポートしています。これにより、2次元リストやフラットなリストを効率的に作成することができます。

例:2次元リストからフラットなリストを作成

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 2次元リストを1次元のリストに変換
flattened = [num for row in matrix for num in row]
print(flattened)  # 出力: [1, 2, 3, 4, 5, 6, 7, 8, 9]

ここでは、2重のforループを使用して、2次元リストの各行の各要素を取り出し、フラットなリストにしています。

リスト内包表記の応用例

文字列操作

文字列の各文字に対して処理を行うこともリスト内包表記で簡単にできます。

# 文字列をリストに変換し、大文字にする
text = "hello"
uppercase_letters = [char.upper() for char in text]
print(uppercase_letters)  # 出力: ['H', 'E', 'L', 'L', 'O']

この例では、文字列"hello"の各文字を取り出し、それを大文字に変換しています。

リストのフィルタリングと変換の組み合わせ

リスト内包表記では、要素をフィルタリング(条件で絞り込み)しつつ、同時にその要素を変換することも可能です。

# 1から10までの数値のうち、偶数は2倍にしてリスト化
modified_numbers = [x * 2 for x in range(1, 11) if x % 2 == 0]
print(modified_numbers)  # 出力: [4, 8, 12, 16, 20]

この例では、偶数を2倍にした値だけが新しいリストに含まれています。

パフォーマンスのメリット

リスト内包表記は、通常のforループよりもパフォーマンスが優れている場合があります。特に大規模なデータを扱う際には、リスト内包表記が効率的にリストを作成するための手段として非常に有用です。以下の例では、リスト内包表記と通常のforループの実行速度を比較しています。

import time
# 通常のforループを使ったリスト生成
start = time.time()
squares_loop = []
for x in range(1000000):
    squares_loop.append(x  2)
end = time.time()
print(f"forループの時間: {end - start:.4f}秒")
# リスト内包表記を使ったリスト生成
start = time.time()
squares_comprehension = [x  2 for x in range(1000000)]
end = time.time()
print(f"リスト内包表記の時間: {end - start:.4f}秒")

多くの場合、リスト内包表記の方が速く処理が完了しますが、非常に複雑な処理の場合は、パフォーマンスが変わらないこともあります。簡潔なコードを書くためにも、リスト内包表記の方が好まれます。

結論

Pythonのリスト内包表記は、効率的かつ簡潔にリストを作成できる強力な機能です。単純なリスト生成から、フィルタリングやネストされたループを使った複雑な処理まで、さまざまな用途に活用できます。コードの可読性を向上させるために、積極的にリスト内包表記を利用してみてください。