【完全理解】Python zip()関数についてあれこれ

# はじめに
zip関数について自分用の学習ノートです。
同じように勉強したい人にとって参考になれば幸いです。
# 基本的な使い方
zip()関数は、複数のイテラブル（リスト、タプル、セットなど）から要素を取り出し、対応する要素をペアとしてまとめるために使用されます。まとめられた要素はタプルとして返されます。

以下に、具体的なコード例を交えながらzip()関数の使い方を解説します。

```python:Python
# 例1: 2つのリストを結合してペアを作成する
numbers = [1, 2, 3, 4, 5]
letters = ['A', 'B', 'C', 'D', 'E']

combined = zip(numbers, letters)
print(list(combined))
# [(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E')]
```

上記の例では、numbersとlettersという2つのリストをzip()関数で結合しています。zip()関数の結果はイテラブルなオブジェクトであるため、list()関数でリストに変換して表示しています。zip()関数によって、numbersとlettersの対応する要素がタプルのペアとしてまとめられています。

```python:Python
# 例2: 異なる長さのリストを結合する
numbers = [1, 2, 3, 4, 5]
letters = ['A', 'B', 'C']

combined = zip(numbers, letters)
print(list(combined))
# [(1, 'A'), (2, 'B'), (3, 'C')]
```

上記の例では、numbersとlettersという2つのリストをzip()関数で結合しています。ここで注目すべき点は、lettersリストの要素数がnumbersリストの要素数よりも少ないという点です。zip()関数は、対応する要素をペアとしてまとめる際に、最短のイテラブルの要素数に合わせて動作します。そのため、lettersリストの最後の要素は無視されます。

```python:Python
# 例3: 複数のリストから値を取り出す
numbers = [1, 2, 3]
letters = ['A', 'B', 'C']
symbols = ['!', '@', '#']

for num, let, sym in zip(numbers, letters, symbols):
    print(num, let, sym)
# 1 A !
# 2 B @
# 3 C #
```

上記の例では、numbers、letters、symbolsという3つのリストから要素を取り出しています。zip()関数をforループで使用することで、対応する要素を同時に取り出すことができます。num、let、symのように複数の変数を使って対応する要素を受け取ることができます。ループの各イテレーションで、対応する要素が取り出され、表示されます。

zip()関数の特徴として、イテラブルなオブジェクトを組み合わせることができる点が挙げられます。リストだけでなく、タプルやセットなどのイテラブルなオブジェクトを組み合わせることも可能です。

また、zip()関数の戻り値はイテラブルなオブジェクトであり、必要に応じてlist()関数などを使ってリストに変換することができます。

以下に、もう1つの例を示します。

```python:Python
# 例4: 文字列のリストから文字を取り出して結合する
words = ['Hello', 'World']
letters = [list(word) for word in words]

combined = zip(*letters)
result = ''.join([''.join(pair) for pair in combined])
print(result)
# HWeolrllod
```
この例では、wordsという文字列のリストがあります。まず、lettersという新しいリストを作成します。このリストは、各文字列を文字のリストに分割したものです。この場合、リスト内包表記とlist()関数を使用しています。

次に、zip(*letters)としてzip()関数を使用しています。*演算子を使うことで、lettersリストを展開して、各リストの要素を対応するものとして組み合わせます。この結果、各リストの同じインデックスの文字が結合されたタプルのペアとして返されます。

最後に、resultを計算します。combinedから取り出されたタプルのペアを文字列に結合し、最終的な結果を得るためにjoin()関数を使用しています。ここでは、リスト内包表記を使って各タプルのペアを結合しています。

これで、zip()関数の基本的な使い方と具体的なコード例を解説しました。zip()関数は複数のイテラブルなオブジェクトの要素を結合し、対応する要素をまとめるために便利です。


# 一緒によく使われる関数

### 1. zip()関数とmap()関数の組み合わせ

zip()関数とmap()関数を組み合わせることで、複数のリストやイテラブルなオブジェクトを同時に処理することができます。

例えば、2つのリストの要素を足し合わせるプログラムを考えてみましょう。

```python:Python
numbers1 = [1, 2, 3, 4, 5]
numbers2 = [10, 20, 30, 40, 50]

result = list(map(lambda x, y: x + y, numbers1, numbers2))
print(result)
# [11, 22, 33, 44, 55]
```
上記の例では、map()関数を使ってlambda式を適用しています。lambda式は、2つの引数を受け取り、それらを足し合わせる処理を行っています。zip()関数を使ってnumbers1とnumbers2の対応する要素をペアとしてまとめ、map()関数に渡しています。map()関数は、numbers1とnumbers2の要素を1つずつ取り出し、lambda式を適用して新しいリストを生成します。

# 2. zip()関数とenumerate()関数の組み合わせ

zip()関数とenumerate()関数を組み合わせることで、リストやイテラブルなオブジェクトの要素とインデックスを同時に処理することができます。

例えば、リストの要素とインデックスを表示するプログラムを考えてみましょう。

```python:Python
fruits = ['apple', 'banana', 'orange']

for index, fruit in enumerate(fruits):
    print(f"Index: {index}, Fruit: {fruit}")
# Index: 0, Fruit: apple
# Index: 1, Fruit: banana
# Index: 2, Fruit: orange
```

上記の例では、enumerate()関数を使ってfruitsリストの要素とインデックスを同時に取得しています。enumerate()関数は、リストの要素を1つずつ取り出し、インデックスと要素のタプルを返します。zip()関数を使わずにenumerate()関数だけを使った場合は、インデックスと要素のタプルが直接取得されますが、zip()関数と組み合わせることで、他のリストの要素と対応させることができます。


# 3. zip()関数とfilter()関数の組み合わせ

zip()関数とfilter()関数を組み合わせることで、ある条件に基づいて要素を絞り込むことができます。

例えば、2つのリストから特定の条件を満たす要素を抽出するプログラムを考えてみましょう。

```python:Python
numbers = [1, 2, 3, 4, 5]
squares = [1, 4, 9, 16, 25]

result = list(filter(lambda x: x[1] == x[0]**2, zip(numbers, squares)))
print(result)
# [(1, 1), (2, 4),(3, 9),(4, 16), (5, 25)]
```

上記の例では、filter()関数を使ってlambda式を適用しています。lambda式は、タプルの要素を受け取り、要素の0番目（numbersの要素）が要素の1番目（squaresの要素）の2乗と等しい場合に真となる条件を定義しています。zip()関数を使ってnumbersとsquaresの対応する要素をペアとしてまとめ、filter()関数に渡しています。filter()関数は、zip()関数から取り出されたタプルを1つずつ取り出し、lambda式の条件に基づいて絞り込みを行います。


# 4. zip()関数とsorted()関数の組み合わせ

zip()関数とsorted()関数を組み合わせることで、複数のリストやイテラブルなオブジェクトを同時にソートすることができます。

例えば、複数のリストを昇順でソートするプログラムを考えてみましょう。

```python:Python
numbers = [3, 1, 4, 2]
letters = ['C', 'A', 'D', 'B']

result = sorted(zip(numbers, letters))
print(result)
# [(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D')]
```
上記の例では、zip()関数を使ってnumbersとlettersの対応する要素をペアとしてまとめ、それをsorted()関数に渡しています。sorted()関数は、ペアとなった要素をソートし、昇順で並べ替えます。ソートされた結果がリストとして返されます。



# 5. zip()関数とdict()関数の組み合わせ

zip()関数とdict()関数を組み合わせることで、2つのリストをキーと値のペアとして持つ辞書を作成することができます。

例えば、キーと値のペアとなる2つのリストから辞書を作成するプログラムを考えてみましょう。

```python:Python
keys = ['a', 'b', 'c']
values = [1, 2, 3]

result = dict(zip(keys, values))
print(result)
# {'a': 1, 'b': 2, 'c': 3}
```
上記の例では、zip()関数を使ってkeysとvaluesの対応する要素をペアとしてまとめ、dict()関数に渡しています。dict()関数は、zip()関数から取り出されたタプルのペアをキーと値として持つ辞書を生成します。その結果、キーと値が対応した辞書が得られます。

# 最後に
いかがでしたでしょうか。
不備などありましたら修正しますのでご連絡ください。


# （おまけ）Pythonの勉強をさらっとしたい人へのおすすめ
https://click.linksynergy.com/deeplink?id=fV/2pKasu8A&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-beginner%2F%3FcouponCode%3D24T7MT72224