Skip to content

zip() in Python: Ottenere elementi da liste multiple

Python

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.

  1. Definire il valore da compilare per tutti gli elenchi
  2. Ottieni il numero massimo di elementi
  3. Riempi tutte le liste fino al numero massimo di elementi
  4. 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'>