web-dev-qa-db-fra.com

Comment parcourir deux listes en parallèle?

J'ai deux iterables en Python et je veux les examiner deux par deux

foo = (1, 2, 3)
bar = (4, 5, 6)

for (f, b) in some_iterator(foo, bar):
    print "f: ", f, "; b: ", b

Il devrait en résulter:

f: 1; b: 4
f: 2; b: 5
f: 3; b: 6

Une façon de le faire est de parcourir les index:

for i in xrange(len(foo)):
    print "f: ", foo[i], "; b: ", b[i]

Mais cela me semble un peu antipythonique. Y a-t-il une meilleure façon de le faire?

643
Nathan Fellman
for f, b in Zip(foo, bar):
    print(f, b)

Zip s’arrête lorsque le plus court de foo ou bar s’arrête.

Dans Python 2, Zip Renvoie une liste de n-uplets. C'est bien quand foo et bar ne sont pas énormes. Si Sont massives, former Zip(foo,bar) est une variable temporaire inutilement massive et doit être remplacé par itertools.izip ou itertools.izip_longest, qui renvoie un itérateur au lieu d'une liste.

import itertools
for f,b in itertools.izip(foo,bar):
    print(f,b)
for f,b in itertools.izip_longest(foo,bar):
    print(f,b)

izip s'arrête lorsque foo ou bar est épuisé .izip_longest s'arrête lorsque foo et bar sont épuisés . Lorsque le ou les itérateurs plus courts sont épuisés, izip_longest renvoie un Tuple avec None dans la position correspondant à cet itérateur. Vous pouvez également définir une variable fillvalue différente de None si vous le souhaitez. Voir ici pour le histoire complète .

Dans Python 3, Zip Renvoie un itérateur de n-uplets, comme itertools.izip en Python2. Pour obtenir une liste des tuples .__, utilisez list(Zip(foo, bar)). Et pour compresser jusqu'à ce que les deux itérateurs soient épuisés, vous utiliseriez itertools.Zip_longest .


Notez également que Zip et ses Zip- like brethen peuvent accepter un nombre arbitraire d'itérables comme arguments. Par exemple,

for num, cheese, color in Zip([1,2,3], ['manchego', 'stilton', 'brie'], 
                              ['red', 'blue', 'green']):
    print('{} {} {}'.format(num, color, cheese))

empreintes

1 red manchego
2 blue stilton
3 green brie
1025
unutbu

Vous voulez la fonction Zip.

for (f,b) in Zip(foo, bar):
    print "f: ", f ,"; b: ", b
46
Karl Guertin

La variable intégrée Zip fait exactement ce que vous voulez. Si vous voulez la même chose sur iterables au lieu de listes, vous pouvez regarder itertools.izip qui fait la même chose mais donne les résultats un à un.

14
robince

Ce que vous recherchez s'appelle Zip .

11
Alex Martelli

Vous devriez utiliser la fonction ' Zip '. Voici un exemple à quoi votre propre fonction Zip peut ressembler

def custom_Zip(seq1, seq2):
    it1 = iter(seq1)
    it2 = iter(seq2)
    while True:
        yield next(it1), next(it2)
6
Vlad Bezden

La fonction zip résout le problème
Docs: Fonction Zip Library

OBJECTIF: mettre la sortie côte à côte Problème:

#value1 is a list
value1 = driver.find_elements_by_class_name("review-text")
#value2 is a list
value2 = driver.find_elements_by_class_name("review-date")

for val1 in value1:
    print(val1.text)
    print "\n"
for val2 in value2:
    print(val2.text)
    print "\n"

Sortie:
review1
review2
review3
date1
date2
date3

Solution:

for val1, val2 in Zip(value1,value2):
    print (val1.text+':'+val2.text)
    print "\n"

Sortie:
review1: date1
review2: date2
review3: date3

5
Manojit Ballav

vous pouvez utiliser 3 types dans un dictionnaire:

def construct_dictionary_from_lists(names, ages, scores):
     end_str_dic = {}
     for item_name, item_age, score_item in Zip(names, ages, scores):
         end_str_dic[item_name] = item_age, score_item
     return end_str_dic


print(
        construct_dictionary_from_lists(
            ["paul", "saul", "steve", "chimpy"],
            [28, 59, 22, 5], 
            [59, 85, 55, 60]
         )
      )
0
shervin hariri