Question Comment parcourir deux listes en parallèle?


J'ai deux itérations en Python, et je veux les parcourir par paires:

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

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

Cela devrait entraîner:

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

Un façon de le faire est d'itérer sur les indices:

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

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


538
2017-11-02 21:26


origine


Réponses:


for f, b in zip(foo, bar):
    print(f, b)

zip s'arrête lorsque le plus court de foo ou bar arrête

Dans Python 2, zip retourne une liste de tuples. C'est bien quand foo et bar ne sont pas massifs. Si ils sont à la fois massifs puis formant zip(foo,bar) est inutilement massif variable temporaire, et devrait ê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 quand soit foo ou bar est épuisé. izip_longest s'arrête quand les deux foo et bar sont épuisés. Lorsque l'itérateur le plus court est épuisé, izip_longest donne un tuple avec None dans la position correspondant à cet itérateur. Vous pouvez également définir un autre fillvalue outre None si vous le souhaitez. Voir ici pour le histoire complète.

Dans Python 3, zip retourne un itérateur de tuples, comme itertools.izip dans Python2. Pour obtenir une liste de tuples, utiliser list(zip(foo, bar)). Et pour compresser jusqu'à ce que les deux itérateurs soient épuisé, vous utiliseriez itertools.zip_longest.


Notez aussi que zip et son zip-comme les frères peuvent accepter un nombre arbitraire d'itérations comme arguments. Par exemple,

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

imprime

1 red manchego
2 blue stilton
3 green brie

856
2017-11-02 21:28



Vous voulez le zip fonction.

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

36
2017-11-02 21:27



Le builtin zip fait exactement ce que vous voulez. Si vous voulez la même chose avec des itératifs au lieu de listes, vous pouvez regarder itertools.izip qui fait la même chose mais donne des résultats un à la fois.


12
2017-11-02 21:28



Ce que vous cherchez s'appelle zip.


9
2017-11-02 21:28



Tu devrais utiliser 'Zip *: français' fonction. Voici un exemple de la façon dont votre propre fonction de zip peut ressembler

def custom_zip(seq1, seq2):
    it1 = iter(seq1)
    it2 = iter(seq2)
    while True:
        yield next(it1), next(it2)

5
2018-04-23 11:09



fonction zip résout le problème
Docs: Fonction de bibliothèque ZIP

AIM: Pour 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


3
2018-03-28 06:39



def ncustom_zip(seq1,seq2,max_length):
        length= len(seq1) if len(seq1)>len(seq2) else len(seq2) if max_length else len(seq1) if len(seq1)<len(seq2) else len(seq2)
        for i in range(length):
                x= seq1[i] if len(seq1)>i else None  
                y= seq2[i] if len(seq2)>i else None
                yield x,y


l=[12,2,3,9]
p=[89,8,92,5,7]

for i,j in ncustom_zip(l,p,True):
        print i,j
for i,j in ncustom_zip(l,p,False):
        print i,j

-1
2017-12-24 14:01