python list(zipobject) returns empty (list) container

Question:

I have run into a strange issue in Python 3.4.3, and it doesn’t seem to be mentioned anywhere.

Lets say:
a = [1,2,3,4] and b = [5,6,7,8]

To concatenate these vertically: ab = zip(a,b)
in python 3, ab itself would return:

zip object at (some hexnumber)

All well here, in python 3, to retrieve the concatenated list:
aabb = list(ab)

Now heres the issue, first time, aabb will indeed return a real list:
[(1, 5), (2, 6), (3, 7), (4, 8)]

Second time and onwards however, if you do the whole process again list(aabb) will simply return an empty [] container, just like list() would do.

It will only work again after I restart shell/interpreter.

Is this normal or a bug?

EDIT: Ok guys I didn’t realise it was to do with zip, it SEEMED constant as ab returned the same hex value everytime so I thought it was to do with list(ab).

Anyway, worked out by reassigning ab = zip(ab)

From what I understand in answers and original link, ab gets disposed once read.

Asked By: DonD

||

Answers:

This problem will not be created by list(aabb) but with list(ab) in your code right now:

a = [1, 2, 3, 4]
b = [5, 6, 7, 8]

ab = zip(a, b)
aabb = list(ab)

print(list(ab))  # -> []

The problem is that zip is an iterator which stores values once and are then disposed like so:

ab = zip(a, b)  # iterator created
aabb = list(ab)  # elements read from ab, disposed, placed in a list

print(list(ab))  # now ab has nothing because it was exhausted

This on the other hand should work because aabb is just a list, not the exhausted iterator ab:

ab = zip(a, b)
aabb = list(ab)

print(list(aabb))  # -> [(1, 5), (2, 6), (3, 7), (4, 8)]
Answered By: Malik Brahimi
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.