リスト内包表記:シンプルに新しいリストを作る#

はじめに#

今回は、リストの特徴的な機能の一つである「リスト内包表記」について学んでいきます。リスト内包表記を使うと、新しいリストを作成するコードをとても短く、読みやすく書くことができます。

通常のforループでリストを作る方法#

まずは、これまでに学んだforループを使って新しいリストを作る方法を復習してみましょう。例えば、数字のリストから、各数字の2乗した数のリストを作るとします。

>
numbers = [1, 2, 3, 4, 5]

# 空のリストを作成
squared_numbers = []

# forループで各数字の2乗を計算し、新しいリストに追加
for num in numbers:
    squared = num * num  # または num ** 2 とも書けます
    squared_numbers.append(squared)

print("元のリスト:", numbers)
print("2乗したリスト:", squared_numbers)
元のリスト: [1, 2, 3, 4, 5]
2乗したリスト: [1, 4, 9, 16, 25]

このコードは次のようなステップで動作します。

  1. 空のリスト squared_numbers を作成
  2. numbers の各要素を取り出して2乗する
  3. 2乗した値を squared_numbers に追加

このコードは正しく動作しますが、もう少し短く、シンプルに書ける方法があります。

リスト内包表記の基本#

リスト内包表記を使うと、上のコードの3つのステップを1行でまとめて書くことができます。

>
numbers = [1, 2, 3, 4, 5]

# リスト内包表記を使って2乗のリストを作成
squared_numbers = [num * num for num in numbers]

print("元のリスト:", numbers)
print("2乗したリスト:", squared_numbers)
元のリスト: [1, 2, 3, 4, 5]
2乗したリスト: [1, 4, 9, 16, 25]

このコードは前の例と全く同じ結果になりますが、リスト内包表記を使った方が短く書けています。

リスト内包表記の構文#

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

[式 for 変数 in イテラブル]
  • : 新しいリストの各要素を生成する式(計算式やその他の処理)
  • 変数: 元のリストから取り出される各要素が入る変数
  • イテラブル: 繰り返し処理の対象(多くの場合はリスト)

この構文は、「イテラブルの各要素を変数に入れて、その変数を使った式の結果を集めた新しいリストを作る」という意味です。

条件付きリスト内包表記#

リスト内包表記では、条件を追加して特定の要素だけを選択することもできます。これを「条件付きリスト内包表記」と呼びます。

>
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 偶数だけを選択して2倍にする
even_doubled = [num * 2 for num in numbers if num % 2 == 0]

print("元のリスト:", numbers)
print("偶数を2倍したリスト:", even_doubled)
元のリスト: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
偶数を2倍したリスト: [4, 8, 12, 16, 20]

条件付きリスト内包表記の構文は次のようになります。

[式 for 変数 in イテラブル if 条件]

この例では、numbers リストの中から偶数だけを選んで(if num % 2 == 0)、それぞれを2倍しています(num * 2)。

これは次のようなforループと同じ結果になります。

>
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 空のリストを作成
even_doubled = []

# forループと条件分岐を使用
for num in numbers:
    if num % 2 == 0:  # 偶数かどうかをチェック
        even_doubled.append(num * 2)

print("元のリスト:", numbers)
print("偶数を2倍したリスト:", even_doubled)
元のリスト: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
偶数を2倍したリスト: [4, 8, 12, 16, 20]

リスト内包表記を使うと、とても簡潔に書けることがわかります。

実用的な例#

例1:単語リストから特定の長さの単語だけを抽出する#

>
words = ["猫", "犬", "象", "カバ", "キリン", "ライオン", "トラ", "パンダ"]

# 2文字以上の動物名だけを抽出する
long_animals = [word for word in words if len(word) >= 2]

print("元の動物リスト:", words)
print("2文字以上の動物:", long_animals)
元の動物リスト: ['猫', '犬', '象', 'カバ', 'キリン', 'ライオン', 'トラ', 'パンダ']
2文字以上の動物: ['カバ', 'キリン', 'ライオン', 'トラ', 'パンダ']

この例では、動物の名前のリストから、2文字以上の名前だけを選んでいます。

例2:数値データから特定の条件を満たす値を抽出する#

>
temperatures = [35, 28, 12, 30, 24, 19, 32, 25, 18, 29]

# 25度以上の気温を「暑い日」として抽出
hot_days = [f"{temp}℃" for temp in temperatures if temp >= 25]

print("全ての気温:", temperatures)
print("暑い日:", hot_days)
全ての気温: [35, 28, 12, 30, 24, 19, 32, 25, 18, 29]
暑い日: ['35℃', '28℃', '30℃', '32℃', '25℃', '29℃']

この例では、気温のリストから25度以上の値を抽出し、その値に「℃」という単位を付けています。

入れ子のリスト内包表記(二重ループ)#

リスト内包表記は、複数のforループを組み合わせることもできます(ネストされたforループ)。例えば、2つのリストの要素から全ての組み合わせを作るような場合に便利です。

>
colors = ["赤", "青", "緑"]
items = ["Tシャツ", "帽子", "バッグ"]

# 色と商品の全ての組み合わせを作成
combinations = [f"{color}{item}" for color in colors for item in items]

print("色:", colors)
print("アイテム:", items)
print("組み合わせ:", combinations)
色: ['赤', '青', '緑']
アイテム: ['Tシャツ', '帽子', 'バッグ']
組み合わせ: ['赤Tシャツ', '赤帽子', '赤バッグ', '青Tシャツ', '青帽子', '青バッグ', '緑Tシャツ', '緑帽子', '緑バッグ']

このコードは次のような2重forループと同等です。

>
colors = ["赤", "青", "緑"]
items = ["Tシャツ", "帽子", "バッグ"]

# 空のリストを作成
combinations = []

# 2重forループ
for color in colors:
    for item in items:
        combinations.append(f"{color}{item}")

print("色:", colors)
print("アイテム:", items)
print("組み合わせ:", combinations)
色: ['赤', '青', '緑']
アイテム: ['Tシャツ', '帽子', 'バッグ']
組み合わせ: ['赤Tシャツ', '赤帽子', '赤バッグ', '青Tシャツ', '青帽子', '青バッグ', '緑Tシャツ', '緑帽子', '緑バッグ']

同じ結果が得られますが、リスト内包表記を使った方が短く書けます。ただし、あまり複雑なリスト内包表記は読みにくくなることもあります。いつもリスト内包表記を使う必要はなく、読みにくいと感じたら通常のforループを使っても問題ありません。

リスト内包表記の利点と注意点#

利点#

  1. 簡潔性: 短いコードで同じ機能を実現できます。
  2. 読みやすさ: シンプルな場合は、一行で意図が伝わりやすいです。
  3. パフォーマンス: 一般的に、同等のforループよりも少し速く動作します。

注意点#

  1. 複雑な処理: あまりに複雑な処理をリスト内包表記に詰め込むと、かえって読みにくくなります。
  2. 長いコード: 一行が長すぎると読みにくくなるので、適度に改行するか、通常のforループを使うべき場合もあります。

まとめ#

今回はPythonのリスト内包表記について学びました。リスト内包表記は、新しいリストを作成するときに便利な機能です。

  • リスト内包表記は [式 for 変数 in イテラブル] の形式で書きます。
  • 条件付きリスト内包表記は [式 for 変数 in イテラブル if 条件] と書きます。
  • リスト内包表記を使うと、forループを使うよりも短くて読みやすいコードが書けます。
  • 複数のforループや条件を組み合わせることもできますが、複雑になりすぎないよう注意しましょう。

リスト内包表記は最初は少し慣れが必要かもしれませんが、マスターすれば非常に便利なツールになります。特にデータ分析やデータ処理を行う際には、頻繁に使われる重要な機能です。