Python 中的 Map() 仅给出一次输出

问题描述 投票:0回答:2

当我遇到以下情况时,我正在使用 Python 3.6.3 中的 map() 函数::

>>> a = [12, 23, 13, 14, 15, 36]
>>> b = [34, 45, 35, 32, 34, 34]
>>> c = [34, 67, 89, 98, 98, 78]
>>> map(lambda x,y,z:x+y+z, a,b,c )
<map object at 0x0000017DD976EC88>
>>> e=map(lambda x,y,z:x+y+z, a,b,c )
>>> list(e)
[80, 135, 137, 144, 147, 148]
>>> list(e)
[]

我的问题是,为什么我第二次使用

list(e)
时无法获得输出。它显示空列表。

有人可以帮我吗?

python python-3.x
2个回答
1
投票

因为在Python 3中,map返回一个迭代器,你只能迭代一次。如果您第二次迭代迭代器,它将立即引发 StopIteration,就好像它是空的一样。这就是为什么当你第二次调用它时你会得到空列表。 有关更多信息,请参阅此问题

希望这对您有帮助! :)


0
投票

第二次调用 list(e) 时得到空列表的原因是因为 map() 返回一个迭代器,而 Python 中的迭代器在迭代它们时会被消耗。一旦您迭代迭代器,它的值就会耗尽,这意味着它们已被消耗并且无法再次访问。

在您的情况下,当您第一次调用 list(e) 时,您会消耗迭代器 e 中的所有值,从而生成列表 [80, 135, 137, 144, 147, 148]。此后,迭代器 e 为空,因为它的所有值都已被消耗。因此,当您再次调用 list(e) 时,它会返回一个空列表,因为迭代器中没有剩余的值可供迭代。

如果您想多次重复使用map()的结果,可以将其转换为列表并将其存储在变量中,然后在需要映射值时使用该变量:

a = [12, 23, 13, 14, 15, 36]
b = [34, 45, 35, 32, 34, 34]
c = [34, 67, 89, 98, 98, 78]


e = list(map(lambda x, y, z: x + y + z, a, b, c))


print(e)  # Output: [80, 135, 137, 144, 147, 148]
print(e)  # Output: [80, 135, 137, 144, 147, 148]
© www.soinside.com 2019 - 2024. All rights reserved.