Skip to content

zip() en Python : Obtenir des éléments de plusieurs listes

En Python, la fonction intégrée zip() agrège plusieurs objets itérables (listes, tuples, etc.). Vous pouvez itérer plusieurs listes dans la boucle for avec zip().

Cet article décrit le contenu suivant.

  • Itérer deux, trois ou plusieurs listes avec zip()
  • Dans le cas où le nombre d’éléments est différent
    • zip() ignore les éléments supplémentaires
    • itertools.zip_longest() remplit les éléments manquants
  • Obtenir une liste de plusieurs éléments itérables

Itérer deux, trois ou plusieurs listes avec zip()

En passant deux listes à zip(), vous pouvez les itérer dans la boucle 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

Il en va de même non seulement pour deux listes mais aussi pour trois listes ou plus.

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

Vous pouvez spécifier d’autres objets itérables ainsi que des listes.

Dans le cas où le nombre d’éléments est différent

Si le nombre d’éléments de chaque objet itérable est différent, zip() ignore les éléments supplémentaires.

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() remplit les éléments manquants

Avec itertools.zip_longest(), vous pouvez remplir les éléments manquants avec n’importe quelle valeur.

Par défaut, il est rempli avec Aucun.

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

Vous pouvez spécifier la valeur à remplir dans le paramètre fillvalue.

for name, age in zip_longest(names, ages, fillvalue=20):
    print(name, age)
# Alice 24
# Bob 50
# Charlie 18
# Dave 20

La valeur à remplir est uniforme même s’il y a plusieurs listes avec des éléments insuffisants. Vous ne pouvez pas spécifier des valeurs différentes.

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

Si vous souhaitez remplir plusieurs listes avec des nombres inconnus d’éléments avec des valeurs différentes, suivez la procédure ci-dessous.

  1. Définir la valeur à remplir pour toutes les listes
  2. Obtenir le nombre maximum d’éléments
  3. Remplir toutes les listes jusqu’au nombre maximum d’éléments
  4. Agréger avec 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

Le processus de remplissage de la liste avec le nombre maximum d’éléments utilise l’initialisation et la concaténation des listes.

Cela peut être une fonction comme celle-ci :

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

Il utilise les compréhensions de liste et le déballage de liste par *.

Obtenir une liste de plusieurs éléments itérables

zip renvoie un itérateur (objet zip) qui contient un tuple avec les éléments de plusieurs objets itérables.

names = ['Alice', 'Bob', 'Charlie']
ages = (24, 50, 18)

z = zip(names, ages)
print(z)
print(type(z))
# 
# <class 'zip'>

Il peut être converti en liste avec 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'>