类型为'的对象;地图';在Python 3中没有len()
我对Python 3有一个问题。我得到了Python2.7代码,目前我正在尝试更新它。我得到一个错误: TypeError:类型为“map”的对象没有len() 在本部分:类型为'的对象;地图';在Python 3中没有len(),python,python-3.x,variable-length,Python,Python 3.x,Variable Length,我对Python 3有一个问题。我得到了Python2.7代码,目前我正在尝试更新它。我得到一个错误: TypeError:类型为“map”的对象没有len() 在本部分: str(len(seed_candidates)) 在我初始化它之前,如下所示: seed_candidates = map(modify_word, wordlist) 有人能解释一下我该做什么吗 (编辑:以前这个代码示例是错误的,因为它使用了set而不是map。现在已经更新了。)在Python 3中,map返回的是一
str(len(seed_candidates))
在我初始化它之前,如下所示:
seed_candidates = map(modify_word, wordlist)
有人能解释一下我该做什么吗
(编辑:以前这个代码示例是错误的,因为它使用了
set
而不是map
。现在已经更新了。)在Python 3中,map
返回的是一个map对象,而不是列表
:
>>> 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()
虽然公认的答案可能适用于OP,但这里有一些东西需要学习,因为有时即使执行OP的
map(modify\u word,wordlist)
casted to list并使用len(list(map(modify\u 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将不断尝试,并将陷入无限循环
因此,当您强制转换到列表时,您应该首先确保您知道您的贴图对象确实会生成有限数量的元素。它对我有效。发布一个完整的例子来说明这个问题。你甚至没有在上面的代码中的任何地方调用map
。这是谷歌目前的最高结果,当前的问题并没有一个很好的map
示例,因此我将对问题进行大幅编辑,并更改OP最初的代码。我想OP在两年前第一次提出这个问题时遗漏了一些东西。如果有人反对,请随时回复。我认为这有一个规范的问题/答案。上面的问题是重复的。我认为列表(L)将使迭代器运行到底,这将使迭代器不再有用(除非您有意复制迭代器)
>>> doubles = map(lambda x: x**2, naturals())
>>> next(doubles)
0
>>> next(doubles)
1
>>> next(doubles)
4
>>> next(doubles)
9
...