
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.
- Définir la valeur à remplir pour toutes les listes
- Obtenir le nombre maximum d’éléments
- Remplir toutes les listes jusqu’au nombre maximum d’éléments
- 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'>