【Python】第2章第14回:zipを活用した複数リストのループ
Pythonのzip
関数は、複数のリストを同時に処理する際に役立つ便利な機能です。本記事では、zip
の基本構文から応用例までを解説します。
0. 記事の概要
この記事を読むメリット
- zipの基本を理解:複数のリストを効率的に処理する方法を学べます。
- コードの可読性向上:ループ内で複数リストを扱う際の記述が簡潔になります。
- 実践的なスキルの習得:応用例を通じて、より高度なデータ処理が可能になります。
この記事で学べること
- zip関数の基本構造と使い方
- zip関数を用いたデータ処理の効率化
- zip関数を応用した実践例
1. zipの基本構造
1.1 基本的な使い方
zip
関数は、複数のイテラブル(リストやタプルなど)を同時にループ処理するために使用されます。
# zipの基本例
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 78]
for name, score in zip(names, scores):
print(f"{name}のスコアは{score}点です。")
動作解説
zip(names, scores)
は、リストnames
とscores
をペアとして結合します。- 各ペアの
name
とscore
がループ内で展開され、print
で出力されます。
1.2 zipの特性
zipは、入力リストの長さが異なる場合、短いリストに合わせて処理を終了します。
# 異なる長さのリストをzipで処理
names = ["Alice", "Bob"]
scores = [85, 90, 78]
for name, score in zip(names, scores):
print(f"{name}のスコアは{score}点です。")
# 出力: Aliceのスコアは85点です。
# Bobのスコアは90点です。
動作解説
- 短いリスト
names
に合わせて、2回のループで処理が終了します。 - 余った要素(78)は無視されます。
2. zipを使った応用例
2.1 データの並べ替え
zipを使って、リストをソートする際に役立つ方法を紹介します。
# zipを使ったソート
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 78]
sorted_data = sorted(zip(scores, names), reverse=True)
for score, name in sorted_data:
print(f"{name}のスコアは{score}点です。")
動作解説
zip(scores, names)
でスコアと名前をペアにします。sorted()
でスコアを基準に降順に並べ替えます。- 並べ替えられたデータをループ処理して出力します。
2.2 リストのアンパック
zipを使って、複数のリストをアンパック(元のリストに戻す)できます。
# zipを使ったアンパック
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 78]
zipped = zip(names, scores)
unzipped = list(zip(*zipped))
print(unzipped)
# 出力: [['Alice', 'Bob', 'Charlie'], [85, 90, 78]]
動作解説
zip(names, scores)
でデータをペアにします。zip(*zipped)
でペアを元の形式(リスト)に戻します。
3. 実践例:zipを活用したプログラム
学生の名前、スコア、順位を同時に処理して出力するプログラムを作成します。
# zipを活用したプログラム
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 78]
ranks = [2, 1, 3]
for name, score, rank in zip(names, scores, ranks):
print(f"{rank}位: {name} - {score}点")
動作解説
- 名前、スコア、順位を
zip
で結合します。 - 各要素を展開し、
print
でフォーマットされた出力を行います。
4. 練習問題
以下の課題に挑戦してみましょう。
- 2つのリストを
zip
で結合し、合計点を出力するプログラムを作成してください。 - 3つのリストを
zip
で結合し、特定の条件に基づいて要素をフィルタリングしてください。
5. 練習問題の解答と解説
問1の解答例
# 合計点を出力
math_scores = [50, 60, 70]
english_scores = [40, 50, 60]
for math, english in zip(math_scores, english_scores):
print(f"合計点: {math + english}")
問2の解答例
# 特定条件でフィルタリング
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 78]
ranks = [2, 1, 3]
for name, score, rank in zip(names, scores, ranks):
if score >= 80:
print(f"{rank}位: {name} - {score}点")
6. まとめ
Pythonのzip
関数は、複数のリストを効率的に処理する際に非常に役立ちます。基本を理解した上で、応用例にも挑戦してみてください。