こんにちは!今回は、Pythonの魔法のような機能「リスト内包表記(List Comprehension)」について詳しく解説します。これはコードをスッキリと書ける便利な機能で、業務効率化やデータ分析でとても役立つテクニックです。
リスト内包表記とは?
リスト内包表記は、複数行のコードをたった1行で書けるPythonの強力な機能です。特に繰り返し処理を使ってリストを作るとき、コードがとてもスッキリします。
従来のfor文とリスト内包表記を比較してみましょう:
# 従来の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つずつ取り出される要素
- イテラブル: リスト、タプル、文字列など、繰り返し処理できるもの
例えば、文字列のリストの各要素を大文字に変換する場合:
names = ["田中", "鈴木", "佐藤", "高橋"]
upper_names = [name.upper() for name in names]
print(upper_names) # ['田中', '鈴木', '佐藤', '高橋']
条件付きリスト内包表記
条件を追加して、特定の要素だけを選択することもできます:
# if文を追加した形
[式 for 変数 in イテラブル if 条件]
例えば、1から20までの数値で偶数だけをリストにする場合:
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までの数値を「偶数」または「奇数」という文字列に変換する場合:
number_types = ["偶数" if num % 2 == 0 else "奇数" for num in range(1, 11)]
print(number_types) # ['奇数', '偶数', '奇数', '偶数', '奇数', '偶数', '奇数', '偶数', '奇数', '偶数']
ネストしたリスト内包表記
リスト内包表記はネスト(入れ子)にすることもできます:
# 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データの処理
# 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:データクリーニング
# 顧客データから空白や特殊文字を削除
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:データフィルタリング
# 特定条件の商品だけを抽出
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には、リスト内包表記以外にも似た書き方ができる構文があります:
辞書内包表記
# 商品名と価格の辞書を作成
items = ["りんご", "バナナ", "オレンジ"]
prices = [100, 80, 120]
fruit_prices = {item: price for item, price in zip(items, prices)}
print(fruit_prices) # {'りんご': 100, 'バナナ': 80, 'オレンジ': 120}
集合内包表記
# 文字列から一意の文字を抽出
text = "Mississippi"
unique_chars = {char for char in text}
print(unique_chars) # {'M', 'i', 'p', 's'}
リスト内包表記のメリット
- コードの簡潔さ: 複数行のコードを1行で書けるので、全体がスッキリします
- 可読性の向上: 適切に使えば、コードの意図が明確になります
- 処理速度の向上: 通常のfor文よりもわずかに高速です
- Pythonらしさ: Pythonの特徴的な書き方で、慣れると他のコードも読みやすくなります
注意点
- 複雑すぎる処理は可読性を損なうので避けましょう
- 長すぎるリスト内包表記は分割を検討しましょう
- 初心者のうちは従来のfor文と並べて書いて動作確認することをおすすめします
まとめ
リスト内包表記は、Pythonで繰り返し処理を簡潔に書ける強力な機能です。業務効率化やデータ分析でよく使う「リストから別のリストを生成する」という処理を美しく書けます。最初は慣れが必要ですが、マスターすれば大幅なコード削減と可読性向上が実現できます。
日常業務のちょっとした繰り返し処理から、大規模なデータ処理まで、幅広く活用できるテクニックなので、ぜひマスターしてください!