Python, Utilisation de la fonction zip() : Récupérer les éléments de plusieurs listes à la fois

Affaires

La fonction intégrée de Python zip() combine les éléments de plusieurs objets itérables (listes, tuples, etc.) et est utilisée pour récupérer les éléments de plusieurs listes dans une boucle for.

Cette section décrit l'utilisation suivante de la fonction zip().

  • Obtenez les éléments de plusieurs listes dans une boucle for.
  • Traitement d'un nombre différent d'éléments
    • zip():La fonction ignorera les éléments qui sont trop nombreux.
    • itertools.zip_longest():Cette fonction permet de compléter les éléments manquants.
  • Obtenir une liste de tuples d'éléments de plusieurs itérables.

Obtenez les éléments de plusieurs listes dans une boucle for.

Si vous voulez récupérer et utiliser les éléments de plusieurs objets itérables (listes, tuples, etc.) en même temps dans une boucle for, spécifiez-les comme arguments de la fonction 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

Pas seulement deux, mais aussi trois 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

Traitement d'un nombre différent d'éléments

La fonction zip() ignore un grand nombre d'éléments.

Dans la fonction zip(), si le nombre d'éléments de chaque liste est différent, le nombre d'éléments le plus petit (le plus court) sera retourné, et le nombre le plus grand sera ignoré.

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 fonction itertools.zip_longest() remplira les éléments manquants.

En utilisant zip_longest() dans le module itertools de la bibliothèque standard, il est possible de remplir les éléments manquants avec des valeurs arbitraires lorsque le nombre d'éléments dans chaque liste est différent.

Par défaut, il est rempli de None.

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 l'argument fillvalue est spécifié, il sera rempli avec cette valeur.

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

Même s'il existe plusieurs listes avec des éléments manquants, la valeur à remplir est uniforme. Il n'est pas possible de 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

Il est possible de spécifier une valeur différente en utilisant zip_longest() à l'intérieur de zip_longest(), mais ce n'est pas pratique car il faut savoir à l'avance quels éléments de la liste sont manquants.

Si vous souhaitez remplir plusieurs listes avec un nombre inconnu d'éléments, chacun ayant une valeur différente, vous pouvez envisager la procédure suivante.

  1. Définir les valeurs à remplir pour toutes les listes.
  2. Obtenir le nombre maximum d'éléments
  3. Remplir toutes les listes au nombre maximum d'éléments
  4. Utilisation de la fonction 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

Dans le processus de remplissage jusqu'au plus grand nombre d'éléments, nous procédons comme suit.

  • Initialisation d'une liste avec une valeur et un nombre d'éléments arbitraires
  • opérateur + pour joindre des listes ensemble

Si nous transformons cela en une fonction, cela ressemble à ceci. La liste originale et les valeurs qui remplissent la liste sont spécifiées en tant qu'arguments itérables (liste ou tuple), respectivement.

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 la notation de compréhension de liste et l'expansion de liste par *.

Obtenir une liste de tuples d'éléments de plusieurs itérables.

La fonction zip() renvoie un itérateur (objet zip) qui est un tuple d'éléments de plusieurs objets itérables.
Il peut également être utilisé en dehors de la boucle for, et la cible n'est pas limitée aux listes.

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

z = zip(names, ages)
print(z)
print(type(z))
# <zip object at 0x10b57b888>
# <class 'zip'>

Si vous voulez obtenir une liste des éléments de plusieurs objets itérables sous forme de tuple, utilisez list() pour créer une liste.

l = list(zip(names, ages))
print(l)
print(type(l))
print(type(l[0]))
# [('Alice', 24), ('Bob', 50), ('Charlie', 18)]
# <class 'list'>
# <class 'tuple'>