
In Python, la funzione incorporata zip() aggrega più oggetti iterabili (liste, tuple, ecc.). Puoi scorrere più elenchi nel ciclo per con zip().
In questo articolo vengono descritti i seguenti contenuti.
- Iterare due, tre o più elenchi con zip()
- Nel caso in cui il numero di elementi sia diverso
- zip() ignora gli elementi extra
- itertools.zip_longest() riempie gli elementi mancanti
- Ottieni un elenco di più elementi iterabili
Iterare due, tre o più elenchi con zip()
Passando due elenchi a zip(), puoi iterarli nel ciclo for.
names = ['Alice', 'Bob', 'Charlie']
ages = [24, 50, 18]
for name, age in zip(names, ages):
print(name, age)
# Alice 24
# Bob 50
# Charlie 18
Lo stesso vale non solo per due liste ma anche per tre o più liste.
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
È possibile specificare altri oggetti iterabili nonché elenchi.
Nel caso in cui il numero di elementi sia diverso
Se il numero di elementi di ogni oggetto iterabile è diverso, zip() ignora gli elementi extra.
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
itertools.zip_longest() riempie gli elementi mancanti
Con itertools.zip_longest(), puoi compilare gli elementi mancanti con qualsiasi valore.
Per impostazione predefinita, è riempito con Nessuno.
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
È possibile specificare il valore da compilare nel parametro fillvalue.
for name, age in zip_longest(names, ages, fillvalue=20):
print(name, age)
# Alice 24
# Bob 50
# Charlie 18
# Dave 20
Il valore da compilare è uniforme anche se sono presenti più elenchi con elementi insufficienti. Non è possibile specificare valori diversi.
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
Se si desidera compilare più elenchi con un numero sconosciuto di elementi con valori diversi, attenersi alla procedura seguente.
- Definire il valore da compilare per tutti gli elenchi
- Ottieni il numero massimo di elementi
- Riempi tutte le liste fino al numero massimo di elementi
- Aggrega con 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
Il processo di riempimento dell’elenco fino al numero massimo di elementi utilizza l’inizializzazione e la concatenazione degli elenchi.
Può essere una funzione come questa:
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
Utilizza la comprensione degli elenchi e la decompressione degli elenchi tramite *.
Ottieni un elenco di più elementi iterabili
zip contiene un iteratore (oggetto zip) che contiene tupla con gli elementi di più oggetti iterabili.
names = ['Alice', 'Bob', 'Charlie']
ages = (24, 50, 18)
z = zip(names, ages)
print(z)
print(type(z))
#
# <class 'zip'>
Può essere convertito in una lista con list().
l = list(zip(names, ages))
print(l)
print(type(l))
print(type(l[0]))
# [('Alice', 24), ('Bob', 50), ('Charlie', 18)]
# <class 'list'>
# <class 'tuple'>