※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。


【Python3】zip()関数の使い方を解説

python python3 ジェネレータ zip

投稿日:2020年10月24日

このエントリーをはてなブックマークに追加
python3のzip()関数について実践を交えて詳しく解説しています。

zip()関数とは?

zip()関数とはPython3のビルトインの関数で、複数の関係したイテレータからジェネレータを生成することができます。

引数に繰り返し処理したい配列をわたします。

使い方(基本)

配列を引数に渡すだけなので簡単です。

for a, b in zip([1, 2, 3], [5, 6, 7]):
    print("{}:{}".format(a,b))
出力
1:5
2:6
3:7

少しだけ注意してほしいのは、長さの違う配列を渡したときには、ジェネレータの長さは勝手に短い方に合わせられるということです。

for a, b in zip([1, 2], [5, 6, 7, 8, 9]):
    print("{}:{}".format(a,b))
出力
1:5
2:6

特にエラーも返さないという点も重要ですね。

注意しないと、バグや脆弱性の発見が遅れてしまうかもしれません。

zipにより生成したジェネレータは*をつけてわたすことで元に戻す(unzip)ことができます。ただし、そこで返されるのはタプルになっている事に注意します。

x = [1, 2, 3]
y = [4, 5, 6]
zipped = zip(x, y)
x2, y2 = zip(*zipped)
print(x2)
print(type(x2))
出力
(1, 2, 3)
<class 'tuple'>

使い方(実践)

例えば以下の様にデータの抽出の場面でzip()関数は非常に柔軟に働いてくれます。

data = [
    {
        "name" : "藍染 惣右介",
        "sex" : "male",
        "height" : 205,
        "weight" : 91
    },
    {
        "name" : "更木 剣八",
        "sex" : "male",
        "height" : 202,
        "weight" : 90
    },
    {
        "name" : "四楓院 夜一",
        "sex" : "female",
        "height" : 156,
        "weight" : 42
    },
    {
        "name" : "日番谷 冬獅郎",
        "sex" : "male",
        "height" : 133,
        "weight" : 28
    },
    {
        "name" : "雛森 桃",
        "sex" : "female",
        "height" : 151,
        "weight" : 39
    },
]

def get_data(keys):
    """dataからkeysで指定されたデータを取得し返す関数
    
    Args:
        keys {list} : 取得したいデータのキーを格納した配列
    
    Returns:
        values {list} : 取得したデータの配列を格納した配列
    """
    values = list()
    for obj in data:
        value = list()
        for key in keys:
            value.append(obj[key])
        values.append(value)
    return values

def print_values(keys, values):
    """
    keyとvalueを表示する
    
    Args:
        keys {list} : valuesを取得した対象のキーの配列
        values {list} : 表示するデータの格納された配列
    """
    for value in values:
        for k, v in zip(keys, value):
            print("{}:{}".format(k, v))
        print("\r\n")

dataという変数が今回の抽出対象のサンプルデータです。

実際の場面ではjsonデータやデータベースからデータを取得して、最終的にこのdata変数のようにpythonのdict型になっている場合が多いでしょう。
zip()関数を使っているのはprint_values()関数のなかです。

まずはこの関数を実際に使ってみます。

keys = ["name", "height", "sex"]
values = get_data(keys)
print_values(keys, values)
出力
name:藍染 惣右介
height:205
sex:male


name:更木 剣八
height:202
sex:male


name:四楓院 夜一
height:156
sex:female


name:日番谷 冬獅郎
height:133
sex:male


name:雛森 桃
height:151
sex:female

いい感じに抽出できてそうですね〜。

またキーの順番を入れ替えたり、重複を入れたりしても問題なく動いてくれます。

keys = ["sex","name", "height", "name", "name", "name"]
values = get_data(keys)
print_values(keys, values)
出力
sex:male
name:藍染 惣右介
height:205
name:藍染 惣右介
name:藍染 惣右介
name:藍染 惣右介


sex:male
name:更木 剣八
height:202
name:更木 剣八
name:更木 剣八
name:更木 剣八


sex:female
name:四楓院 夜一
height:156
name:四楓院 夜一
name:四楓院 夜一
name:四楓院 夜一


sex:male
name:日番谷 冬獅郎
height:133
name:日番谷 冬獅郎
name:日番谷 冬獅郎
name:日番谷 冬獅郎


sex:female
name:雛森 桃
height:151
name:雛森 桃
name:雛森 桃
name:雛森 桃

参考書籍

このエントリーをはてなブックマークに追加


関連記事

記事へのコメント