概要
組み込み関数zip()
は、引数のコレクションやイテレーターの要素を組み合わせた値を返すイテレーター。ジッパーの左右の小さな金具が交互に合わさって一つになるイメージ。
使い方
zip()
の引数に、1つにしたい複数のコレクションを与える。戻り値はイテレーター。
1 2 3 4 5 6 7 8 |
list1 = ['Tokyo', 'Aichi', 'Osaka'] list2 = [13, 23, 27] print(zip(list1, list2)) # <zip object at 0x0000015B8AB51640> print(list(zip(list1, list2))) # [('Tokyo', 13), ('Aichi', 23), ('Osaka', 27)] |
イテレーターなのでfor
ループなどに使える。
1 2 3 4 5 6 |
for item1, item2 in zip(list1, list2): print(item1, item2) # Tokyo 13 # Aichi 23 # Osaka 27 |
引数はコレクションのほかイテレーターも可能。
1 2 3 4 5 6 |
for item1, item2 in zip(range(1, 7, 2), range(2, 8, 2)): print(item1, item2) # 1 2 # 3 4 # 5 6 |
引数が3つ以上でも可能。
1 2 3 4 5 6 7 8 9 10 |
list1 = [1, 4, 7] list2 = [2, 5, 8] list3 = [3, 6, 9] for item1, item2, item3 in zip(list1, list2, list3): print(item1, item2, item3) # 1 2 3 # 4 5 6 # 7 8 9 |
リスト化した時の表現
zip()
をリスト化した時の結果list(zip())
を確認しておく。1つにまとめられた内容が、それぞれタプルとなっている。
1 2 3 4 5 6 7 8 9 10 |
list1 = ['Tokyo', 'Aichi', 'Osaka'] list2 = [13, 23, 27] print(list(zip(list1, list2))) # [('Tokyo', 13), ('Aichi', 23), ('Osaka', 27)] list1 = [1, 4, 7] list2 = [2, 5, 8] list3 = [3, 6, 9] print(list(zip(list1, list2, list3))) # [(1, 2, 3), (4, 5, 6), (7, 8, 9)] |
引数の長さが違うとき
引数のコレクションやイテレーターの長さが異なるときは、短いものに合わされて、他のの残りの内容は無視される。
1 2 3 4 5 6 |
list1 = [1, 2, 3] list2 = [10, 20, 30, 40, 50] print(list(zip(list1, list2))) # [(1, 10), (2, 20), (3, 30)] |
itertools.zip_longest()
を使うと、最も長いものに合わされて、残りが指定された値で埋められる。
直接関係ないこと~zipper
“zipper”という言葉はAmerican Englishで、グッドリッチ社の商標登録だった言葉がいわゆるファスナーを指す名詞になったようだ。British Englishではzipが名詞としてファスナーの意味となる。
動詞のzipはzipperから「(ファスナーで)締める」という意味を持つ。そもそもzipという動詞には、素早く動く、飛んでいくといった意味があるらしい(informal to go somewhere or do something very quickly ~ LONGMAN)。が、日本語サイトの英和辞書では後者の訳が先に出ているが、LONGMAN/Camblidge/Oxfordなどのオンライン辞書では前者のファスナー関係の訳が先に来ている。日本語サイトがnativeの感覚と異っているのがわかる。