【问题标题】:Object of type 'map' has no len() in Python 3'map' 类型的对象在 Python 3 中没有 len()
【发布时间】:2016-05-02 12:48:01
【问题描述】:

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

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

在这部分:

str(len(seed_candidates))

在我这样初始化它之前:

seed_candidates = map(modify_word, wordlist)

那么,谁能解释一下我必须做什么?

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

【问题讨论】:

  • 它对我有用。发布一个演示问题的完整示例。你甚至没有在上面的代码中调用map
  • 这是目前来自 Google 的最高结果,并且当前问题实际上并没有很好的 map 示例,因此我将稍微彻底地编辑问题并更改 OP 的代码原来有。我想 OP 在两年前第一次提出这个问题时错过了一些东西。如果有人反对,请随时恢复

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


【解决方案1】:

在 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

【讨论】:

  • 我认为有一个规范的问题/答案。上面的问题是重复的。
  • 我认为 list(L) 将使迭代器运行到最后,这将使该迭代器不再有用(除非您故意复制该迭代器)
【解决方案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 将尝试并继续尝试,并将陷入无限循环。

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

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 2017-06-13
    • 2019-01-06
    • 2018-07-20
    • 2015-01-21
    • 2021-03-03
    • 2015-07-30
    • 1970-01-01
    相关资源
    最近更新 更多