プログラミングの世界では、複数のソースからのデータを組み合わせて処理することはよくある作業です。Pythonのzip()関数は、2つ以上の要素から1つの要素に結合するためのツールです。このzip()関数は洋服のチャックもしくはファスナー(英語ではzipperと表現されます)が嚙み合うように、データの位置関係に基づいて要素をペアリングすることができ、様々なデータ操作タスクを簡単にしてくれる関数です。
zip() 関数の基本
zip() 関数は、2 つ以上のイテラブルな要素 (※イテラブル=「リスト、タプル、文字列などのfor文で繰り返すことができる要素」) を受け取り、ペアリングしたタプルを生成します。
以下は zip() 関数の基本構文です:
zip(iterable1, iterable2, …)
# iterable = for文で繰り返すことができるオブジェクト
zip()関数の一般的な使い方
- リストの結合: zip() を使用して、2 つ以上のリストを要素ごとに結合し、異なるソースからの関連データを保持するタプルを作成できます。
- 辞書の作成: zip() を使用して別々のリストから辞書のキーと値として結合することで、辞書を簡潔に構築することができます。
- ペアのループ処理: zip() は、複数のイテラブルな要素をペアリングしならループ処理することができます。
以下にそれぞれの例を挙げます。
リストの結合
names = ["Alice", "Bob", "Charlie"]
scores = [95, 87, 92]
combined = list(zip(names, scores))
print(combined)
namesとscoresのリストを結合してタプルを出力。
[('Alice', 95), ('Bob', 87), ('Charlie', 92)]
辞書の作成
keys = ["name", "age", "country"]
values = ["Ken", 28, "Japan"]
person_dict = dict(zip(keys, values))
print(person_dict)
keysとvaluesのリストを使ってzip()で結合して、dict()関数で辞書型を出力
{'name': 'Ken', 'age': 28, 'country': 'Japan'}
ペアのループ処理
days = ["Monday", "Tuesday", "Wednesday"]
tasks = ["Meeting", "Cooking", "Running"]
for day, task in zip(days, tasks):
print(f"On {day}, do: {task}")
for文の中にzip()で結合したデータを使ってループ処理をして出力
On Monday, do: Meeting
On Tuesday, do: Cooking
On Wednesday, do: Running
zip()関数の働きを詳しく解説
もう少しzip()関数の働きを詳しく見ていきましょう。まずは以下のコードを実行してください。
main_ingredients = ["鶏肉", "ジャガイモ", "サラダ"]
quantities = [2, 4, 1]
seasonings = ["塩", "コショウ", "胡麻ドレ"]
combined = list(zip(main_ingredients, quantities, seasonings))
print(combined)
出力は、
[('鶏肉', 2, '塩'), ('ジャガイモ', 4, 'コショウ'), ('サラダ', 1, '胡麻ドレ')]
となります。
この例では、main_ingredients、quantities、seasonings の 3 つのリストがあります。zip()関数は各リストの要素をタプルに結合し、元のリストの位置に基づいてペアリングします。例えば、最初のタプルはmain_ingredientsの最初の要素と、quantitiesの最初の要素、seasoningsの最初の要素を結びつけたものです。
処理の内訳を詳しく書くと:
('鶏肉', 2, '塩') -> (main_ingredients[0], quantities[0], seasonings[0])
('ジャガイモ’, 4, 'コショウ') -> (main_ingredients[1], quantities[1], seasonings[1])
('サラダ', 1, '胡麻ドレ') -> (main_ingredients[2], quantity[2], seasonings[2])
文章では分かりにくいかもしれないので、zip()の働きを図で示すと以下のようになります。
どうでしょう?図で書くとわかりやすいですね。要するに縦に並ぶ要素でリストの各要素(タプル)が作られています。
zip()関数を使った練習問題
zip()関数を使った練習問題を2問作成しました。
1. テスト成績の計算
今、あなたは2つのリストを持っています:
・学生の名前
・対応するテストの得点を含んでいます。
student_names = ["keiko", "tomo", "ken", "mari", "akane"]
test_scores = [87, 92, 78, 65, 91]
あなたは学生の平均点を計算し、以下の基準に基づいて評点を割り当てたいとします:
- A: 90 以上
- B: 80 - 89
- C: 70 - 79
- D: 60 - 69
- F: 60 未満
zip()関数を使用して学生の名前と得点を結合するPythonプログラムを書いてみましょう。次に平均点を計算し、各生徒に評点を割り当てます。最後に、生徒の名前、得点、成績をプリントアウトしてみましょう。
テスト成績の計算のコード
まず、zip()関数を使って、データを結合しましょう。
combined_data = zip(student_names, test_scores)
次に平均点の計算と成績の基準の割り当てをコードにします。
# 平均点の計算
average_score = sum(test_scores) / len(test_scores)
# 成績基準
def test_grade(score):
if score >= 90:
return "A"
elif score >= 80:
return "B"
elif score >= 70:
return "C"
elif score >= 60:
return "D"
else:
return "F"
では、最後に判定結果を出力します。
print("Student\tScore\tGrade")
for name, score in combined_data:
grade = test_grade(score)
print(f"{name}\t{score}\t{grade}")
print(f"Average Score: {average_score:.2f}")
出力
Student Score Grade
tomo 92 A
ken 78 C
mari 65 D
akane 91 A
Average Score: 82.60
zip()でまとめたデータをfor文を使ってループ処理することで成績表ができましたね。
ちなみにコード内の「\t」は、水平タブを表すエスケープシーケンスです。文字列の内でタブキーを押したようなスペース(インデント)を作成するために使用されます。上記のコードでは、列間の間隔を一定にし、出力が整然とした書式になるように、「\t」が使われています。
2. vital sign分析
では、もう一問。今度は患者のバイタルサインをzip()関数を使って結合し分析するコードを書いてみましょう。
患者 ID と、それに対応する心拍数(拍/分)と体温が記載された 2 つのリストを使って、平均心拍数と体温を計算し、異常なバイタルサインを持つ患者を特定し、さらなる評価のための推奨事項を付け加えるデータ分析コードを書いてみましょう。
patient_ids = [101, 102, 103, 104, 105]
heart_rates = [78, 95, 105, 72, 110]
body_temperatures = [37.2, 36.8, 38.5, 37.0, 38.9]
さらに、心拍数と体温の結果から以下の追記事項を加えます。
- 心拍数が 60 未満または 100 以上の患者:「追加検査を検討」
- 体温が 36.0 未満または 38.0 以上の患者:「モニタリングが必要」
vital sign分析のコード
zip() 関数を使用して患者データを結合しましょう。
combined_data = zip(patient_ids, heart_rates, body_temperatures)
次に、患者の平均心拍数と体温を計算します。
average_heart_rate = sum(heart_rates) / len(heart_rates)
average_temperature = sum(body_temperatures) / len(body_temperatures)
さらに心拍数が 60 未満または 100 以上の患者、または体温が 36.0 未満または 38.0 以上の患者を識別する関数を作成します。
def vital_signs_recommendation(heart_rate, temperature):
recommendations = []
if heart_rate < 60 or heart_rate > 100:
recommendations.append("追加検査を検討")
if temperature < 36.0 or temperature > 38.0:
recommendations.append("モニタリングが必要")
return ", ".join(recommendations) if recommendations else "問題なし"
「テスト成績の計算」の時と同様に関数を作成しました。こちらの関数は今回のzip()関数のテーマからかけ離れているので、コードの詳細はあまり触れませんが、最後のreturnの部分は文字列のシーケンスを指定した区切り文字列で連結 (join) するためにjoin()関数を使っています。
患者のバイタルサインと追加事項を出力します。
print("患者ID\t\t心拍数\t\t体温\t\t追記")
for patient_id, heart_rate, temperature in combined_data:
recommendations = vital_signs_recommendation(heart_rate, temperature)
print(f"{patient_id}\t\t{heart_rate}\t\t{temperature:.2f}\t\t{recommendations}")
print(f"\nAverage Heart Rate: {average_heart_rate:.2f}")
print(f"Average Temperature: {average_temperature:.2f}")
出力
患者ID 心拍数 体温 追記
101 78 37.20 問題なし
102 95 36.80 問題なし
103 105 38.50 追加検査を検討, モニタリングが必要
104 72 37.00 問題なし
105 110 38.90 追加検査を検討, モニタリングが必要
zip()関数を使った練習問題を作成してみました。このようにしてみるとzip()関数を自在に使えるようになるとデータ分析やプログラミングの幅が広がりそうですね。
まとめ
zip()関数を使えば、複数のソースから要素ごとにペアリングし、元のデータ間の関係を維持した新しいデータを作成することができます。
zip()関数はデータ操作、変換、分析タスクにおいて不可欠なPythonツールですので、zip()関数を使いこなして、様々な種類のデータを効率的に扱う能力を高めましょう!
コメント