Geschiedenis van de vraag
De functie zip() is in Python geïntroduceerd als een handige manier om meerdere reeksen te 'verknopen' in tuples met overeenkomstige elementen, wat resulteert in een soort 'matrix'-structuur.
Probleem
Fouten treden op wanneer ontwikkelaars zip toepassen op reeksen van verschillende lengtes, in de verwachting dat het resultaat zal zijn op basis van de langste, of wanneer ze de unpacking onjuist gebruiken bij de omgekeerde conversie.
Oplossing
zip() accepteert een of meerdere reeksen en retourneert een iterator van tuples, waarbij de n-de tuple de n-de elementen uit alle reeksen bevat. De iteratie eindigt zodra de kortste reeks is uitgeput.
Voorbeeld code:
names = ['John', 'Anna', 'Peter'] ages = [28, 22, 35] grouped = list(zip(names, ages)) print(grouped) # [('John', 28), ('Anna', 22), ('Peter', 35)]
Belangrijke kenmerken:
Wat gebeurt er als zip reeksen van verschillende lengtes ontvangt?
Het resultaat heeft de lengte van de kortste reeks. De andere elementen worden genegeerd.
zip([1,2,3], ['a','b']) # [(1,'a'), (2,'b')]
Kan zip worden 'ontvouwd'? Hoe kan ik de oorspronkelijke reeksen terugkrijgen?
Ja, met behulp van unpacking met een sterretje en zip(*iterator):
pairs = [(1, "a"), (2, "b")] numbers, letters = zip(*pairs) print(numbers) # (1, 2)
Wat is het verschil tussen zip en itertools.zip_longest?
zip_longest van itertools werkt tot de langste reeks, vulde ontbrekende waarden in met de opgegeven fillvalue.
from itertools import zip_longest zip_longest([1,2], ['a','b','c'], fillvalue=None) # [(1,'a'), (2,'b'), (None, 'c')]
We verwerkten gebruikers- en wachtwoordparen via zip, maar de lijsten bleken van verschillende lengtes. Enkele gebruikers werden niet meegenomen vanwege de werking van zip op de kortste lijst.
Voordelen:
Nadelen:
Voor het combineren van de testresultaten en de namen van studenten hebben we zip_longest met fillvalue="n/a" gebruikt, waardoor we gegevens van alle deelnemers konden behouden.
Voordelen:
Nadelen: