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



我对Python 3有一个问题。我得到了Python 2.7代码,现在我正在尝试更新它。我得到了错误:

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

在这个部分:

str(len(seed_candidates))

在我这样初始化它之前:

seed_candidates = map(modify_word, wordlist)

那么,有人能解释一下我该做什么吗?

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

在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

虽然接受的答案可能对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将尝试并继续尝试,并将陷入无限循环。

因此,当您转换到列表时,您应该首先确保您知道您的映射对象确实会产生有限数量的元素

相关内容

  • 没有找到相关文章

最新更新