この問題の歴史
zip()関数は、複数のシーケンスを関連する要素のタプルに「縫い合わせる」便利な方法としてPythonに登場しました。これは、特異な「行列」構造を得るのに役立ちます。
問題
開発者が異なる長さのシーケンスにzipを適用する場合、結果が最も長いシーケンスに基づくことを期待するとエラーが発生するか、逆変換時のアンパッキングを誤って使用することがあります。
解決策
zip()は1つまたは複数のシーケンスを受け取り、n番目のタプルにはすべてのシーケンスからのn番目の要素が含まれるタプルのイテレータを返します。最も短いシーケンスが尽きるまでイテレーションが続きます。
コード例:
names = ['John', 'Anna', 'Peter'] ages = [28, 22, 35] grouped = list(zip(names, ages)) print(grouped) # [('John', 28), ('Anna', 22), ('Peter', 35)]
主な特性:
zipに異なる長さのシーケンスを渡すとどうなりますか?
結果は最も短いシーケンスの長さになります。他の要素は無視されます。
zip([1,2,3], ['a','b']) # [(1,'a'), (2,'b')]
zipを「展開」できますか?元のシーケンスを再取得する方法は?
はい、アンパッキングのアスタリスクとzip(*iterator)を使用して:
pairs = [(1, "a"), (2, "b")] numbers, letters = zip(*pairs) print(numbers) # (1, 2)
zipとitertools.zip_longestの違いは何ですか?
itertoolsのzip_longestは最も長いシーケンスまで機能し、指定されたfillvalueで隙間を埋めます。
from itertools import zip_longest zip_longest([1,2], ['a','b','c'], fillvalue=None) # [(1,'a'), (2,'b'), (None, 'c')]
ユーザーとパスワードのペアをzipで処理しましたが、リストの長さが異なっていました。そのため、いくつかのユーザーが短いリストに基づいて考慮されませんでした。
利点:
欠点:
テスト結果と学生の名前をzip_longestを使用してfillvalue="n/a"で結合し、すべての参加者のデータを保持しました。
利点:
欠点: