【Python入門】リスト内包表記の使い方完全ガイド!業務効率化の強い味方

こんにちは!今回は、Pythonの魔法のような機能「リスト内包表記(List Comprehension)」について詳しく解説します。これはコードをスッキリと書ける便利な機能で、業務効率化やデータ分析でとても役立つテクニックです。

リスト内包表記とは?

リスト内包表記は、複数行のコードをたった1行で書けるPythonの強力な機能です。特に繰り返し処理を使ってリストを作るとき、コードがとてもスッキリします。

従来のfor文とリスト内包表記を比較してみましょう:

Python
# 従来のfor文を使った方法
numbers = []
for i in range(1, 11):
    numbers.append(i * 2)
print(numbers)  # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

# リスト内包表記を使った方法
numbers = [i * 2 for i in range(1, 11)]
print(numbers)  # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

わずか1行でfor文と同じ処理が実現できています!これがリスト内包表記の魅力です。

リスト内包表記の基本構文

基本的な構文はとてもシンプルです:

[式 for 変数 in イテラブル]
  • : 各要素に対して実行する操作
  • 変数: イテラブル(リストなど)から1つずつ取り出される要素
  • イテラブル: リスト、タプル、文字列など、繰り返し処理できるもの

例えば、文字列のリストの各要素を大文字に変換する場合:

Python
names = ["田中", "鈴木", "佐藤", "高橋"]
upper_names = [name.upper() for name in names]
print(upper_names)  # ['田中', '鈴木', '佐藤', '高橋']

条件付きリスト内包表記

条件を追加して、特定の要素だけを選択することもできます:

# if文を追加した形
[式 for 変数 in イテラブル if 条件]

例えば、1から20までの数値で偶数だけをリストにする場合:

Python
even_numbers = [num for num in range(1, 21) if num % 2 == 0]
print(even_numbers)  # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

式の部分にif-elseを使う

条件によって異なる値を設定したい場合は、式の部分に三項演算子(if-else)を使います:

# 式の部分にif-elseを使う形
[値1 if 条件 else 値2 for 変数 in イテラブル]

例えば、1から10までの数値を「偶数」または「奇数」という文字列に変換する場合:

Python
number_types = ["偶数" if num % 2 == 0 else "奇数" for num in range(1, 11)]
print(number_types)  # ['奇数', '偶数', '奇数', '偶数', '奇数', '偶数', '奇数', '偶数', '奇数', '偶数']

ネストしたリスト内包表記

リスト内包表記はネスト(入れ子)にすることもできます:

Python
# 2次元リストを平坦化する例
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

ただし、複雑なネストは可読性が下がるので注意が必要です。無理に1行で書く必要はありません。

業務自動化・データ分析での活用例

例1:Excelデータの処理

Python
# Excelから読み込んだ売上データから税込金額を計算
sales_data = [100, 200, 300, 400, 500]
tax_included = [price * 1.1 for price in sales_data]
print(tax_included)  # [110.0, 220.0, 330.0, 440.0, 550.0]

使える場面: 毎月の売上レポート作成時に、大量のデータに一括で計算を適用するとき

例2:データクリーニング

Python
# 顧客データから空白や特殊文字を削除
customer_emails = ["info@example.com", " user@gmail.com ", "admin@company.com\n"]
cleaned_emails = [email.strip() for email in customer_emails]
print(cleaned_emails)  # ['info@example.com', 'user@gmail.com', 'admin@company.com']

使える場面: CSVで受け取った外部データの不要な空白を一括除去するとき

例3:データフィルタリング

Python
# 特定条件の商品だけを抽出
products = [
    {"name": "商品A", "price": 1000, "stock": 10},
    {"name": "商品B", "price": 2000, "stock": 0},
    {"name": "商品C", "price": 3000, "stock": 5}
]
in_stock = [product for product in products if product["stock"] > 0]
print(in_stock)  # [{'name': '商品A', 'price': 1000, 'stock': 10}, {'name': '商品C', 'price': 3000, 'stock': 5}]

使える場面: 在庫管理システムで在庫切れ商品を除外したレポート作成時

リスト内包表記の仲間たち

Pythonには、リスト内包表記以外にも似た書き方ができる構文があります:

辞書内包表記

Python
# 商品名と価格の辞書を作成
items = ["りんご", "バナナ", "オレンジ"]
prices = [100, 80, 120]
fruit_prices = {item: price for item, price in zip(items, prices)}
print(fruit_prices)  # {'りんご': 100, 'バナナ': 80, 'オレンジ': 120}

集合内包表記

Python
# 文字列から一意の文字を抽出
text = "Mississippi"
unique_chars = {char for char in text}
print(unique_chars)  # {'M', 'i', 'p', 's'}

リスト内包表記のメリット

  1. コードの簡潔さ: 複数行のコードを1行で書けるので、全体がスッキリします
  2. 可読性の向上: 適切に使えば、コードの意図が明確になります
  3. 処理速度の向上: 通常のfor文よりもわずかに高速です
  4. Pythonらしさ: Pythonの特徴的な書き方で、慣れると他のコードも読みやすくなります

注意点

  • 複雑すぎる処理は可読性を損なうので避けましょう
  • 長すぎるリスト内包表記は分割を検討しましょう
  • 初心者のうちは従来のfor文と並べて書いて動作確認することをおすすめします

まとめ

リスト内包表記は、Pythonで繰り返し処理を簡潔に書ける強力な機能です。業務効率化やデータ分析でよく使う「リストから別のリストを生成する」という処理を美しく書けます。最初は慣れが必要ですが、マスターすれば大幅なコード削減と可読性向上が実現できます。

日常業務のちょっとした繰り返し処理から、大規模なデータ処理まで、幅広く活用できるテクニックなので、ぜひマスターしてください!

Leave a Comment

Your email address will not be published. Required fields are marked *