PR

簡単!python zip()関数の使い方入門:3つの基本的な使い方と練習問題

python
記事内に広告が含まれています / This article contains ads

プログラミングの世界では、複数のソースからのデータを組み合わせて処理することはよくある作業です。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()関数を使いこなして、様々な種類のデータを効率的に扱う能力を高めましょう!

コメント