La funció integrada de Python zip() combina els elements de múltiples objectes iterables (llistes, tuples, etc.) i s’utilitza per recuperar els elements de diverses llistes en un bucle for.
Aquesta secció descriu el següent ús de la funció zip().
- Obteniu els elements de diverses llistes en un bucle for.
- Tractament amb diferents nombres d’elements
zip()
:La funció ignorarà els elements que són massa.itertools.zip_longest()
:Aquesta funció omplirà els elements que falten.
- Obteniu una llista de tuples d’elements de múltiples iterables.
Obteniu els elements de diverses llistes en un bucle for.
Si voleu recuperar i utilitzar els elements de diversos objectes iterables (llistes, tuples, etc.) alhora en un bucle for, especifiqueu-los com a arguments per a la funció zip().
names = ['Alice', 'Bob', 'Charlie'] ages = [24, 50, 18] for name, age in zip(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18
No només dos, sinó tres o més també.
points = [100, 85, 90] for name, age, point in zip(names, ages, points): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 90
Tractament amb diferents nombres d’elements
La funció zip() ignora un gran nombre d’elements.
A la funció zip(), si el nombre d’elements de cada llista és diferent, es retornarà el nombre d’elements menor (més curt) i s’ignorarà el nombre més gran.
names = ['Alice', 'Bob', 'Charlie', 'Dave'] ages = [24, 50, 18] for name, age in zip(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18
La funció itertools.zip_longest() omplirà els elements que falten.
Utilitzant zip_longest() al mòdul itertools de la biblioteca estàndard, és possible omplir els elements que falten amb valors arbitraris quan el nombre d’elements de cada llista és diferent.
Per defecte, s’omple amb Cap.
from itertools import zip_longest names = ['Alice', 'Bob', 'Charlie', 'Dave'] ages = [24, 50, 18] for name, age in zip_longest(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave None
Si s’especifica l’argument fillvalue, s’omplirà amb aquest valor.
for name, age in zip_longest(names, ages, fillvalue=20): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave 20
Fins i tot si hi ha diverses llistes amb elements que falten, el valor a omplir és uniforme. No és possible especificar valors diferents.
points = [100, 85] for name, age, point in zip_longest(names, ages, points, fillvalue=20): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 20 # Dave 20 20
És possible especificar un valor diferent utilitzant zip_longest() dins de zip_longest(), però no és pràctic perquè cal saber per endavant quins elements de la llista falten.
Si voleu omplir diverses llistes amb un nombre desconegut d’elements, cadascun amb un valor diferent, es pot considerar el procediment següent.
- Definiu els valors per omplir per a totes les llistes.
- Obteniu el nombre màxim d’elements
- Ompliu totes les llistes fins al nombre màxim d’elements
- Utilitzant la funció zip().
fill_name = 'XXX' fill_age = 20 fill_point = 50 len_names = len(names) len_ages = len(ages) len_points = len(points) max_len = max(len_names, len_ages, len_points) names = names + [fill_name] * (max_len - len_names) ages = ages + [fill_age] * (max_len - len_ages) points = points + [fill_point] * (max_len - len_points) print(names) print(ages) print(points) # ['Alice', 'Bob', 'Charlie', 'Dave'] # [24, 50, 18, 20] # [100, 85, 50, 50] for name, age, point in zip(names, ages, points): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 50 # Dave 20 50
En el procés d’omplir el major nombre d’elements, fem el següent.
- Inicialització d’una llista amb un valor i nombre d’elements arbitraris
- + operador per unir llistes juntes
Si ho convertim en una funció, es veurà així. La llista original i els valors que omplen la llista s’especifiquen com a arguments iterables (llista o tupla), respectivament.
def my_zip_longest(iterables, fillvalues): max_len = max(len(i) for i in iterables) return zip(*[list(i) + [v] * (max_len - len(i)) for i, v in zip(iterables, fillvalues)]) for name, age, point in my_zip_longest((names, ages, points), ('XXX', 20, 50)): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 50 # Dave 20 50
Utilitza la notació de comprensió de llistes i l’expansió de la llista per *.
- Articles relacionats:Utilitzant la notació de comprensió de llista de Python
Obteniu una llista de tuples d’elements de múltiples iterables.
La funció zip() retorna un iterador (objecte zip) que és una tupla d’elements de diversos objectes iterables.
També es pot utilitzar fora del bucle for, i l’objectiu no es limita a les llistes.
names = ['Alice', 'Bob', 'Charlie'] ages = (24, 50, 18) z = zip(names, ages) print(z) print(type(z)) # <zip object at 0x10b57b888> # <class 'zip'>
Si voleu obtenir una llista dels elements de diversos objectes iterables com a tupla, utilitzeu list() per fer una llista.
l = list(zip(names, ages)) print(l) print(type(l)) print(type(l[0])) # [('Alice', 24), ('Bob', 50), ('Charlie', 18)] # <class 'list'> # <class 'tuple'>