Object of type 'map' has no len() in Python 3
Asked Answered
D

2

68

I have a problem with Python 3. I got Python 2.7 code and at the moment I am trying to update it. I get the error:

TypeError: object of type 'map' has no len()

at this part:

str(len(seed_candidates))

Before I initialized it like this:

seed_candidates = map(modify_word, wordlist)

So, can someone explain me what I have to do?

(EDIT: Previously this code example was wrong because it used set instead of map. It has been updated now.)

Discerning answered 2/5, 2016 at 12:48 Comment(2)
It works for me. Post a full example that demonstrates the problem. You didn't even call map anywhere in the code above.Snowy
This is currently the top result from Google and the current question doesn't really have a great example of map, so I'm going to edit the question somewhat drastically and change the code the OP originally had. I imagine OP missed out something back when the question was first asked two years ago. Feel free to revert if anyone objectsTeenager
T
109

In Python 3, map returns a map object not a list:

>>> L = map(str, range(10))
>>> print(L)
<map object at 0x101bda358>
>>> print(len(L))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'map' has no len()

You can convert it into a list then get the length from there:

>>> print(len(list(L)))
10
Teenager answered 2/5, 2016 at 12:51 Comment(2)
I think there is a canonical question/answer for this. The above question is a duplicate.Kolomna
I think list(L) will make the iterator run to the end, and that will make that iterator won't be useful again(unless you reproduce that iterator on purpose)Inheritance
C
11

While the accepted answer might work for the OP, there are some things to learn here, because sometimes you can't find the length even with doing the OP's map(modify_word, wordlist) casted into list and checking the length with len(list(map(modify_word, wordlist))). You can't because sometimes the length is infinite.

For example let's consider the following generator that lazy calculate all the naturals:

def naturals():
    num = 0
    while True:
        yield num
        num +=1

And let's say I want to get the square of each of those, that is,

doubles = map(lambda x: x**2, naturals())

Note that this is a completely legit use of map function, and will work, and will allow you to use next() function on the doubles variable:

>>> doubles = map(lambda x: x**2, naturals())
>>> next(doubles)
0
>>> next(doubles)
1
>>> next(doubles)
4
>>> next(doubles)
9
...

But, what if we try to cast it into a list? Obviously python can't know if we are trying to iterate through a never-ending iterator. So if we'll try to cast an instance of this mapObject to a list, python will try and keep trying and will get stuck on an infinite loop.

So when you cast to list, you should first make sure you know your map object will indeed yield finite number of elements.

Costermansville answered 28/4, 2020 at 15:4 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.