Python >> Tutoriel Python >  >> Python

Comment parcourir deux listes en parallèle ?

Résumé : Utilisez la méthode Python intégrée zip() parcourir deux listes en parallèle. Le zip() renvoie un itérateur de tuples et le n ième l'élément de chaque itérateur peut être apparié en utilisant le zip() fonction. D'autres méthodes d'itération dans les listes en parallèle incluent le enumerate() méthode et l'approche traditionnelle d'itération à l'aide d'un pour boucle.

Problème : Étant donné deux listes ; comment parcourir chaque élément des deux listes simultanément ?

Exemple : Considérez que vous avez deux listes comme indiqué dans l'exemple ci-dessous.

founder = ['Steve Jobs', 'Bill Gates', 'Jeff Bezos']
org = ['Apple', 'Microsoft', 'Amazon']

print("Founder        Organization")
for f, o in some_iterator(founder,org):
  print (f,"   ", o)

Résultat attendu :

Founder        Organization
Steve Jobs     Apple
Bill Gates     Microsoft
Jeff Bezos     Amazon

Dans l'exemple ci-dessus, nous avons besoin d'un itérateur ou d'une méthode pour générer la sortie attendue afin d'imprimer les éléments des listes par paires un par un. Alors sans plus tarder, plongeons-nous dans les solutions.

Méthode 1 :Utilisation de zip()

Comme son nom l'indique le zip() function est une fonction intégrée à Python qui renvoie un objet zip qui représente un itérateur de tuples. Cela nous permet de coupler avec le premier élément de chaque itérateur, puis de coupler le deuxième élément de chaque itérateur et ainsi de suite.

zip() Dans Python 3 vs Python 2

  • zip() en Python 3 renvoie un itérateur de tuples , alors que zip() en Python 2 renvoie une liste de tuples .
  • Pour obtenir une liste de tuples en utilisant zip() en Python 3, utilisez list(zip(f, o))
  • Pour obtenir un itérateur de tuples à l'aide de zip() en Python 2, utilisez itertools.izip

Remarque : zip() arrête d'itérer une fois que la liste la plus courte parmi les itérables donnés est épuisée. Voyons ce que cela signifie dans l'exemple ci-dessous.

li_1 = ['a', 'b', 'c']
li_2 = [1,2]
for f, o in zip(li_1, li_2):
  print(f, o)

Sortie :

a 1
b 2

➥ Dans l'exemple ci-dessus zip() a cessé d'itérer une fois la liste la plus courte qui est li_2 était épuisé, d'où l'élément c n'a pas été inclus dans la sortie. Par conséquent, pour itérer jusqu'à l'itérateur le plus long, utilisez :

  • itertools.zip_longest() si vous utilisez Python 3.
  • itertools.izip_longest si vous utilisez Python 2.
  • Dans chaque cas, nous devons importer le itertools module.

Exemple :

import itertools
li_1 = ['a','b','c']
li_2 = [1,2]
for f, o in itertools.zip_longest(li_1, li_2):
  print(f, o)

Sortie :

a 1
b 2
c None

Maintenant que nous savons utiliser le zip() en Python, voyons comment nous pouvons l'utiliser pour résoudre notre problème dans le programme ci-dessous.

founder = ['Steve Jobs', 'Bill Gates', 'Jeff Bezos']
org = ['Apple', 'Microsoft', 'Amazon']

print("Founder        Organization")
for f, o in zip(founder, org):
  print (f,"   ", o)

Sortie :

Founder        Organization
Steve Jobs     Apple
Bill Gates     Microsoft
Jeff Bezos     Amazon

Méthode 2 :Utilisation de la boucle For

Une autre approche pour parcourir les deux listes en parallèle consiste à utiliser un for boucle. Bien que ce ne soit peut-être pas la solution la plus Pythonique à notre problème, cela sert l'objectif. Examinons le programme suivant pour comprendre comment nous pouvons utiliser le for boucle pour résoudre notre problème.

Exemple :

founder = ['Steve Jobs', 'Bill Gates', 'Jeff Bezos']
org = ['Apple', 'Microsoft', 'Amazon']

print("Founder        Organization")
for i in range(len(founder)):
  print(founder[i],"   ",org[i])

Sortie :

Founder        Organization
Steve Jobs     Apple
Bill Gates     Microsoft
Jeff Bezos     Amazon

Vous trouverez ci-dessous une solution en une ligne pour la méthode ci-dessus :

founder = ['Steve Jobs', 'Bill Gates', 'Jeff Bezos']
org = ['Apple', 'Microsoft', 'Amazon']

print([( founder[i], org[i]) for i in range(len(founder))])

Sortie :

[('Steve Jobs', 'Apple'), ('Bill Gates', 'Microsoft'), ('Jeff Bezos', 'Amazon')]

Méthode 3 :émuler zip() à l'aide d'une fonction personnalisée

La meilleure pratique pour parcourir deux listes en parallèle consiste à utiliser le zip() fonction qui a été mentionnée précédemment. Vous pouvez également émuler le fonctionnement de la méthode zip() en créant votre propre fonction personnalisée avec le yield mot-clé pour renvoyer les éléments des deux listes par paires.

yield est un mot clé similaire au return mot-clé, mais en cas de yield la fonction renvoie un générateur. Pour en savoir plus sur le rendement mot-clé en Python, veuillez suivre notre tutoriel de blog ici.

Voyons maintenant comment nous pouvons définir notre fonction personnalisée pour parcourir plusieurs éléments de liste simultanément.

founder = ['Steve Jobs', 'Bill Gates', 'Jeff Bezos']
org = ['Apple', 'Microsoft', 'Amazon']
count = len(founder)

def custom_zip():
    global count
    it1 = iter(founder)
    it2 = iter(org)
    try:
      while count>0:
          yield next(it1), next(it2)
          count = count -1
    except:
      raise StopIteration

for item in custom_zip():
       print(list(item))

Sortie :

['Steve Jobs', 'Apple']
['Bill Gates', 'Microsoft']
['Jeff Bezos', 'Amazon']

Méthode 4 :Utiliser enumerate()

Le enumerate() en Python, ajoute un compteur à un itérable comme un tuple ou une liste et le renvoie sous la forme d'un objet d'énumération. Nous pouvons utiliser pour parcourir les listes en parallèle, comme indiqué dans le programme ci-dessous.

founder = ['Steve Jobs', 'Bill Gates', 'Jeff Bezos']
org = ['Apple', 'Microsoft', 'Amazon']
count = len(founder)
print("Founder        Organization")
for n, f in enumerate( founder ):
  print(f,"   ",org[n] )

Sortie :

Founder        Organization
Steve Jobs     Apple
Bill Gates     Microsoft
Jeff Bezos     Amazon

Si vous utilisez toujours Python 2.x, vous pouvez également utiliser la fonction map() avec le premier argument comme None puis parcourez les deux listes en parallèle. Je n'ai pas inclus cette méthode dans notre liste de solutions car, si vous utilisez Python 3.x, cette solution ne fonctionnera pas car vous obtiendrez un TypeError. Cependant, juste pour comprendre, regardons l'utilisation de la méthode map pour une ancienne version de Python.

Exemple :

a = ['A', 'B', 'C']
b = ['I', 'II', 'III']
for x, y in map(None, a, b):
    print(x, y)

Sortie en Python 2.x :

('A', 'I')
('B', 'II')
('C', 'III')

Sortie en Python 3.x :

Traceback (most recent call last):
  File "main.py", line 4, in <module>
    for x, y in map(None,a, b):
TypeError: 'NoneType' object is not callable

Conclusion

Les principaux points à retenir de cet article étaient :

  • Comment parcourir deux listes en Python à l'aide des méthodes suivantes :
    • Le zip() méthode :
      • Quelle est la différence lors de l'utilisation de zip() dans Python 3 et Python 2 ?
      • L'importance de itertools.zip_longest() .
    • boucle for.
    • enumerate() méthode.
    • En émulant la fonction zip() à l'aide d'une fonction personnalisée.
    • Utilisation de la méthode map() dans Python 2.x.

Veuillez vous abonner et rester à l'écoute pour d'autres articles intéressants !


Post précédent