言語バージョン 3.9.0

公開日 2020年12月12日 JST

更新日 2021年1月15日 JST

コード例の出力としてprint関数を使用しています。

使用方法がわからない場合は以下のページを参照してからコード例を確認してください。

print関数の使用方法

zip

このページでは豊富な例を用いてPythonのzip関数の使い方を学ぶことができます。

zip関数は引数で指定した値からzipオブジェクトを生成し、戻り値(返り値)として返します。
zipオブジェクトはイテレータオブジェクトであり、tuple型(タプル)の要素を生成します。 このtuple内の要素や要素数は引数で与えた値により変化します。

また、zip関数の引数は可変長であり、各値は反復可能(iterable)なオブジェクトである必要があります。

TL;DR

基本

# zipオブジェクトの引数は可変長引数で、反復可能(iterable)なオブジェクトを取る
# 文字列(strクラス)は反復可能なオブジェクト
string1 = 'Python'
zip1 = zip(string1)
print(zip1)
==> <zip object at {オブジェクト識別値}>
print(type(zip1))
==> <class 'zip'>
# zipオブジェクトの要素を取り出す
for element in zip1:
    # 要素の型はタプル型(tuple)
    print(element, type(element))
==> ('P',) <class 'tuple'>
==> ('y',) <class 'tuple'>
==> ('t',) <class 'tuple'>
==> ('h',) <class 'tuple'>
==> ('o',) <class 'tuple'>
==> ('n',) <class 'tuple'>




# 複数の引数を渡す場合
list1 = [1, 2, 3, 4, 5]
list2 = ['py', 'js', 'go', 'ts', 'kt']
zip2 = zip(list1, list2)
for e in zip2:
    print(e)
==> (1, 'py')
==> (2, 'js')
==> (3, 'go')
==> (4, 'ts')
==> (5, 'kt')




list0 = [1, 2, 3]
list01 = ['python', 'javascript', 'typescript']
zip0 = zip(list0, list01)
# zipオブジェクトは反復可能オブジェクトなのでlistの引数に指定可能
print(list(zip0))
==> [(1, 'python'), (2, 'javascript'), (3, 'typescript')]




# zipオブジェクトが生成するタプルの数は、最も長さの短い反復可能オブジェクトに依存します
list3 = [1, 2]
list4 = ['apple', 'kiwi', 'peach', 'banana', 'orange', 'mango']
list5 = [True, False, True, True]
zip3 = zip(list3, list4, list5)
for e in zip3:
    print(e)
# list3の長さに合わせた数のtupleが生成される
==> (1, 'apple', True)
==> (2, 'kiwi', False)




string2 = '12345'
tuple1 = ('py', 'js')
list6 = ['Python', 'JavaScript', 'Go']
# 1つのtupleの要素をe1,e2,e3に代入
# zip(string2, tuple1, list6)と同様の表現、*(アスタリスク)演算子を使って引数を展開している
for e1, e2, e3 in zip(*[string2, tuple1, list6]):
    print(e1, e2, e3)
==> 1 py Python
==> 2 js JavaScript




# zipオブジェクトはイテレータオブジェクトであるのでnextを使用して要素を取得できます
tuple2 = (0, 1)
dict1 = {'id': 1, 'name': 'Emma', 'age': 26}
zip4 = zip(tuple2, dict1.items())
while True:
    try:
        # zip4の要素であるtupleのインデックス0と1の値をe1とe2にそれぞれ代入
        e1, e2 = next(zip4)
        print(e1, e2)
    except StopIteration:
        print('---')
        break
==> 0 ('id', 1)
==> 1 ('name', 'Emma')
==> ---

関連情報:forの使用方法

関連情報:whileの使用方法

関連情報:type(組み込み関数)の使用方法

zipオブジェクトの解凍

tuple1 = (100, 200, 300)
list1 = ['Python', 'JavaScript', 'TypeScript']
zip1 = zip(tuple1, list1)
print(list(zip1))
==> [(100, 'Python'), (200, 'JavaScript'), (300, 'TypeScript')]




# zip関数で生成したオブジェクトをtuple型で解凍(unzip)する
zip2 = zip(tuple1, list1)
# *(アスタリスク)演算子を使用する
tuple1_x, list1_x = zip(*zip2)
# 解凍後の戻り値はtuple型
print(type(tuple1_x), type(list1_x))
==> <class 'tuple'> <class 'tuple'>
print(tuple1_x, list1_x)
==> (100, 200, 300) ('Python', 'JavaScript', 'TypeScript')




# 要素数が異なる場合
list2 = ['apple', 'banana']
list3 = [1, 2, 3, 4, 5]
list4 = [True, False, True, True]
zip3 = zip(list2, list3, list4)
list2_x, list3_x, list4_x = zip(*zip3)
# 長さが短い方に合わせてzipオブジェクトが生成されるので、要素が欠落する場合もある
print(list2_x, list3_x, list4_x)
==> ('apple', 'banana') (1, 2) (True, False)

解説

基本

zip関数はzipオブジェクトを戻り値(返り値)として返します。

引数は可変長であり、各引数に反復可能なオブジェクトを指定します。

また、イテレータオブジェクトであるzipオブジェクトはtuple型の要素を生成しますが、 このtuple要素には引数で与えた各反復可能オブジェクトの同じインデックスの値が引数順で設定されています。

注意点として、zipオブジェクトが生成する要素の数が、 引数で与えた反復可能オブジェクトのうち最も長さの短いものに合わせて生成されることです。
引数で与えた反復可能オブジェクトがこの長さ以上の要素数をもつ場合、 それらの値が無視されたzipオブジェクトが生成されることに気をつけてください。

list1 = [100, 200, 300]
zip1 = zip(list1)
print(zip1)
==> <zip object at {オブジェクト識別値}>
print(type(zip1))
==> <class 'zip'>
for element in zip1:
    print(element, type(element))
==> (100,) <class 'tuple'>
==> (200,) <class 'tuple'>
==> (300,) <class 'tuple'>




# 複数の引数を渡す場合
string1 = '1234'
tuple1 = (100, 200, 300, 400)
zip2 = zip(string1, tuple1)
for e in zip2:
    print(e)
==> ('1', 100)
==> ('2', 200)
==> ('3', 300)
==> ('4', 400)




# zipオブジェクトが生成するタプルの数は、最も長さの短い反復可能オブジェクトに依存します
range1 = range(10)
string2 = 'ABC'
list2 = ['Python', 'JavaScript']
for e in zip(range1, string2, list2):
    print(e)
# list2の長さに合わせた数のtupleが生成される
==> (0, 'A', 'Python')
==> (1, 'B', 'JavaScript')




# 生成されたタプルの各要素をe1,e2,e3に代入する記述方法
# zip(range1, string2, list2)と同様の表現、*(アスタリスク)演算子を使って引数を展開している
for e1, e2, e3 in zip(*(range1, string2, list2)):
    print(e1, e2, e3)
==> 0 A Python
==> 1 B JavaScript




# zipオブジェクトはイテレータオブジェクトであるのでnextを使用して要素を取得可能
list3 = [0, 1]
dict1 = {'name': 'John', 'age': 19, 'grade': 6}
zip3 = zip(list3, dict1.items())
while True:
    try:
        # zip4の要素であるtupleのインデックス0と1の値をe1とe2にそれぞれ代入
        e1, e2 = next(zip3)
        print(e1, e2)
    except StopIteration:
        print('---')
        break
==> 0 ('name', 'John')
==> 1 ('age', 19)
==> ---

関連情報:forの使用方法

関連情報:whileの使用方法

関連情報:type(組み込み関数)の使用方法

zipオブジェクトの解凍

一度zip関数で生成されたzipオブジェクトは、 以下のコード例のように*(アスタリスク)演算子を使用することで元のオブジェクトに似た形式に解凍(unzip)することができます。

ただし、戻り値がtuple型であることと、生成時に無視された値に関しては復元不可能なことに注意してください。

string1 = 'ABC'
list1 = [100, 200, 300, 400, 500]
zip1 = zip(string1, list1)
string1_x, list1_x = zip(*zip1)
print(string1_x, list1_x)
==> ('A', 'B', 'C') (100, 200, 300)

1次情報

zip(組み込み関数) - Pythonドキュメント