投稿日:2020年10月24日
python3の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:雛森 桃