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

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

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

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

在这部分:

str(len(seed_candidates))

在我这样初始化之前:

seed_candidates = map(modify_word, wordlist)

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

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

在 Python 3 中,map returns 地图对象不是 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

虽然接受的答案可能适用于 OP,但这里有一些东西需要学习,因为 有时即使执行 OP [=13] 也找不到长度 =] 投射到列表中并使用 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 将 尝试并继续尝试 并将陷入无限循环。

所以当你转换为列表时,你应该首先确保你知道你的地图对象确实会产生有限数量的元素。