地图功能返回的列表在一次使用后消失

时间:2014-02-11 23:16:30

标签: python string list python-3.x dictionary

我是Python的新手。我正在使用Python 3.3.2并且我很难弄清楚为什么会出现以下代码:

strList = ['1','2','3']
intList = map(int,strList)
largest = max(intList)
smallest = min(intList)

给我这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: min() arg is an empty sequence

但是这段代码:

strList = ['1','2','3']
intList = list(map(int,strList))
largest = max(intList)
smallest = min(intList)

完全没有错误。

我的想法是,当intList被赋值给map函数的返回值时,它会变成迭代器而不是列表,如the docs所示。也许作为调用max()的副作用,迭代器已经迭代到列表的末尾,导致Python相信列表是空的(我在这里从C知识中提取,我不熟悉迭代器如何在Python中真正起作用。)我必须支持的唯一证据是,对于第一个代码块:

>>> type(intList)
<class 'map'>

而对于第二个代码块:

>>> type(intList)
<class 'list'>

有人可以确认或否认这个吗?

2 个答案:

答案 0 :(得分:17)

你完全正确。在Python 3中,map返回一个迭代器,你只能迭代一次。如果你第二次遍历迭代器,它会立即引发StopIteration,就像它是空的一样。 max消耗整个事物,min将迭代器视为空。如果您需要多次使用这些元素,则需要调用list来获取列表而不是迭代器。

答案 1 :(得分:6)

来自map文档:

  

返回一个迭代器,它将函数应用于每个iterable项,产生结果。

http://docs.python.org/3/library/stdtypes.html#typeiter

  

一旦迭代器的 next ()方法引发StopIteration,它必须在后续调用中继续这样做。

因此,无论基础数据对象如何,迭代器只能使用一次。它建立在发电机的概念之上。

可以使用

itertools.tee从一个中创建多个独立的迭代器。

l1,l2 = itertools.tee(intList,2)
max(l1)
min(l2)