Soru Tarihi
zip() fonksiyonu, birkaç diziyi eşleşen elemanlarla bir araya getirmenin rahat bir yolu olarak Python'da ortaya çıktı ve adeta "matris" benzeri bir yapı elde etti.
Sorun
Geliştiricilerin farklı uzunluktaki diziler için zip'i kullandıklarında, sonucunun en uzun olan diziye göre olacağını beklemeleri veya ters dönüşümde açma işlemini yanlış kullanmaları durumunda hata oluşur.
Çözüm
zip() bir veya daha fazla dizi alır ve n. tupoyu, tüm dizilerden n. elemanları içeren bir tuple döndürerek, en kısa dizi tükenene kadar döngüyü devam ettirir.
Kod örneği:
names = ['John', 'Anna', 'Peter'] ages = [28, 22, 35] grouped = list(zip(names, ages)) print(grouped) # [('John', 28), ('Anna', 22), ('Peter', 35)]
Ana özellikler:
Farklı uzunluktaki dizilere zip verildiğinde ne olur?
Sonuç en kısa dizinin uzunluğunda olur. Diğer elemanlar göz ardı edilir.
zip([1,2,3], ['a','b']) # [(1,'a'), (2,'b')]
zip'i "açmak" mümkün mü? Başlangıç dizilerini geri almak için nasıl yapılır?
Evet, yıldız ile açma ve zip(*iterator) kullanarak:
pairs = [(1, "a"), (2, "b")] numbers, letters = zip(*pairs) print(numbers) # (1, 2)
zip ile itertools.zip_longest arasındaki fark nedir?
itertools'taki zip_longest, en uzun dizinin sonuna kadar çalışır ve boş alanları belirtilen fillvalue ile doldurur.
from itertools import zip_longest zip_longest([1,2], ['a','b','c'], fillvalue=None) # [(1,'a'), (2,'b'), (None, 'c')]
Kullanıcı-pareleri ve şifrelerini zip kullanarak işledik, ancak listeler farklı uzunluktaydı. Birkaç kullanıcı, zip'in kısa listeye göre çalışmasından dolayı dikkate alınmadı.
Artılar:
Eksiler:
Test sonuçlarını ve öğrencilerin isimlerini birleştirmek için zip_longest kullanarak fillvalue="n/a" ile tüm katılımcıların verilerini koruduk.
Artılar:
Eksiler: