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?
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
Vous voulez la fonction Zip
.
for (f,b) in Zip(foo, bar):
print "f: ", f ,"; b: ", b
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.
Ce que vous recherchez s'appelle Zip
.
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)
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
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]
)
)