“map”类型的对象在Python 3中没有len()

时间:2016-05-02 12:48:02

标签: python python-3.x variable-length

我遇到了Python 3的问题。我得到了Python 2.7代码,目前我正在尝试更新它。我收到错误:

  

TypeError:'map'类型的对象没有len()

在这一部分:

str(len(seed_candidates))

在我这样初始化之前:

seed_candidates = map(modify_word, wordlist)

那么,有人可以向我解释我必须做什么吗?

(编辑:以前此代码示例错误,因为它使用了set而不是map。它现在已更新。)

2 个答案:

答案 0 :(得分:44)

在Python 3中,map返回的地图对象不是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()

您可以将其转换为列表,然后从那里获取长度:

>>> print(len(list(L)))
10

答案 1 :(得分:2)

虽然接受的答案可能适用于OP,但这里有一些事情要学习,因为有时您找不到长度,即使将OP的map(modify_word, wordlist)强制转换为列表并使用len(list(map(modify_word, wordlist)))检查长度。 不能,因为有时长度是无限的

例如,让我们考虑以下生成器,它们懒惰地计算所有自然数:

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

假设我想获得每个平方的平方,即

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

请注意,这完全是对map函数的合法使用,并且可以使用,并且允许您在doubles变量上使用next()函数:

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

但是,如果我们尝试将其投射到列表中怎么办?显然,python无法知道我们是否尝试通过永无休止的迭代器进行迭代。因此,如果我们尝试将此MapObject的实例强制转换为列表,则python将尝试并继续尝试,并且将陷入无限循环。

因此,当您投射到列表时,首先应确保知道地图对象确实会产生有限数量的元素。