This is a classic python3 doh!.
A filter is a special iterable object you can iterate over. However, much like a generator, you can iterate over it only once. So, by calling list(people2)
, you are iterating over each element of the filter
object to generate the list
. At this point, you’ve reached the end of the iterable and nothing more to return.
So, when you call list(people2)
again, you get an empty list.
Demo:
>>> l = range(10)
>>> k = filter(lambda x: x > 5, l)
>>> list(k)
[6, 7, 8, 9]
>>> list(k)
[]
I should mention that with python2, filter
returns a list, so you don’t run into this issue. The problem arises when you bring py3’s lazy evaluation into the picture.