Calling filter returns <filter object at ... >

132,786

Solution 1

It looks like you're using python 3.x. In python3, filter, map, zip, etc return an object which is iterable, but not a list. In other words,

filter(func,data) #python 2.x

is equivalent to:

list(filter(func,data)) #python 3.x

I think it was changed because you (often) want to do the filtering in a lazy sense -- You don't need to consume all of the memory to create a list up front, as long as the iterator returns the same thing a list would during iteration.

If you're familiar with list comprehensions and generator expressions, the above filter is now (almost) equivalent to the following in python3.x:

( x for x in data if func(x) ) 

As opposed to:

[ x for x in data if func(x) ]

in python 2.x

Solution 2

It's an iterator returned by the filter function.

If you want a list, just do

list(filter(f, range(2, 25)))

Nonetheless, you can just iterate over this object with a for loop.

for e in filter(f, range(2, 25)):
    do_stuff(e)
Share:
132,786
Prasad
Author by

Prasad

Updated on November 24, 2020

Comments

  • Prasad
    Prasad over 3 years

    I am learning the concept of filters in Python. I am running a simple code like this.

    >>> def f(x): return x % 2 != 0 and x % 3 != 0
    >>> filter(f, range(2, 25))
    

    But instead of getting a list, I am getting some message like this.

    <filter object at 0x00FDC550>
    

    What does this mean? Does it means that my filtered object i.e list to come out is stored at that memory location? How do I get the list which I need?

  • Prasad
    Prasad over 11 years
    Thanks a lot. Also, please can you tell me what is this number 0x00FDC550
  • Prasad
    Prasad over 11 years
    Thanks a lot. Also, please can you tell me what is this number 0x00FDC550
  • mgilson
    mgilson over 11 years
    That's the object's ID. In CPython, it's the memory location.
  • sloth
    sloth over 11 years
    It's the memory address of that object. It's the default output when printing an object if the class of that object don't has the__repr__() method that is used to control the output.
  • user2846569
    user2846569 over 9 years
    wow ... interesting ... I thought [] snd list() are equivalent, but [filter(func, data)] doesn't work the same
  • Mr_and_Mrs_D
    Mr_and_Mrs_D over 9 years
    @user2846569: what's the difference ?
  • user2846569
    user2846569 over 9 years
    @Mr_and_Mrs_D try putting an iterator object itObj in [] and you will get [itObj], while putting in list() you will get values from object like [1, 4, 7], assuming itObj has these values.
  • Bin
    Bin over 7 years
    If I want to get the size of result, should convert to list, then call len(). Not so convenient as before.
  • mgilson
    mgilson over 7 years
    @Bin -- Nope. It's a trade-off. The 3.x version is more efficient in many contexts (e.g. passing to any allows short circuiting). I think that picking up that efficiency as well as the ability to work with generators of arbitrary size were seen as sufficient benefits to give up the easy length checking. After all, to recover the ability to get the length, you just need to call len(list(filter(...))) instead of len(filter(...)).