Python 3.2
t = (1, 2, 3)
t2 = (5, 6, 7)
z = zip(t, t2)
for x in z:
print(x)
Result:
(1, 5) (2, 6) (3, 7)
Putting in EXACTLY the same loop immediately after, nothing is printed:
for x in z:
print(x)
z still exists as <zip object at 0xa8d48ec>. I can even reassign the t, t2 to be zipped again, but then it only works once and only once, again.
Is this how its supposed to work? There’s no mention in the docs about this.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
That’s how it works in python 3.x. In python2.x, zip returned a list of tuples, but for python3.x, zip behaves like itertools.izip behaved in python2.x. To regain the python2.x behavior, just construct a list from zip‘s output:
z = list(zip(t,t2))
Note that in python3.x, a lot of the builtin functions now return iterators rather than lists (map, zip, filter)
Method 2
Because zip returns an iterator in Python 3.x. If you want to re-use it, then make it a list first:
z = list(zip(t, t2))
Method 3
zip returns an iterator (in Python 3). You can only iterate over an iterator once. The iterator doesn’t vanish when it’s out of elements, but iterating over it again gives 0 elements. If you want a list, call list on it:
z = list(zip(t, t2))
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0