163 votes

Existe-t-il une meilleure façon de parcourir deux listes, en obtenant un élément de chaque liste pour chaque itération?

J'ai une liste de Latitudes et l'un des Longitudes et à itérer sur la latitude et la longitude des paires.

Tu penses que c'est mieux:

A) supposons que l'égalité des longueurs est déjà cochée)

for i in range(len(Latitudes):
  Lat,Long=(Latitudes[i],Longitudes[i])

*** EDIT .... ou, B)

for Lat,Long in [(x,y) for x in Latitudes for y in Longitudes]:
  ....

**** EDIT (12/17) Remarque que B est incorrecte. Cela me donne toutes les paires, équivalent à itertools.produit()

Toute réflexion sur les mérites de chacun. Je suis toujours dans le coup d'être "pythonic"

308voto

Roberto Bonvallet Points 6336

C'est aussi pythonique que vous pouvez obtenir:

 for lat, long in zip(Latitudes, Longitudes):
    print lat, long
 

22voto

Wogan Points 9176

C'est bien de voir beaucoup d'amour pour zip dans les réponses ici.

Toutefois, il convient de noter que si vous utilisez une version python antérieure à la version 3.0, le module itertools de la bibliothèque standard contient une fonction izip qui renvoie une valeur itérable, qui est plus appropriée dans ce cas. cas particulier (surtout si votre liste de latt / longs est assez longue).

En python 3 et plus tard, zip se comporte comme izip .

15voto

JudoWill Points 2191

si vos listes de latitude et de longitude sont volumineuses et chargées paresseusement:

 from itertools import izip
for lat, lon in izip(latitudes, longitudes):
    process(lat, lon)
 

ou si vous voulez éviter la boucle for

 from itertools import izip, imap
out = imap(process, izip(latitudes, longitudes))
 

7voto

notnoop Points 30218

Itérer à travers des éléments de deux listes simultanément s'appelle zipper, et python fournit une fonction intégrée pour cela, qui est documentée ici .

 >>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> zipped
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zipped)
>>> x == list(x2) and y == list(y2)
True
 

[Exemple tiré de pydocs]

Dans votre cas, ce sera simplement:

 for (lat, lon) in (latitudes, longitudes):
    ... process lat and lon
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X