Python map函数返回的列表在使用一次后消失
我是Python新手。我正在使用Python 3.3.2,我很难弄清楚为什么会出现以下代码:Python map函数返回的列表在使用一次后消失,python,string,list,python-3.x,dictionary,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:
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
没有给我任何错误
我的想法是,当intList被分配给map函数的返回值时,它会变成迭代器,而不是列表,如所示。也许作为调用max()
的一个副作用,迭代器被迭代到列表的末尾,导致Python认为列表是空的(我在这里借鉴C知识,我不熟悉迭代器在Python中的实际工作方式)。我必须支持的唯一证据是,对于第一个代码块:
>>> type(intList)
<class 'map'>
>>> type(intList)
<class 'list'>
>类型(intList)
而对于第二段代码:
>>> type(intList)
<class 'map'>
>>> type(intList)
<class 'list'>
>类型(intList)
有人能帮我确认或否认吗?你完全正确。在Python3中,
map
返回一个迭代器,该迭代器只能迭代一次。如果您第二次迭代某个迭代器,它将立即引发StopIteration
,就好像它是空的一样max
消耗整个内容,min
将迭代器视为空。如果需要多次使用元素,则需要调用list
以获取列表而不是迭代器。来自映射
文档:
返回一个迭代器,该迭代器将函数应用于iterable的每个项,并生成结果
来自
一旦迭代器的next()方法引发StopIteration,它必须在后续调用中继续这样做
因此,无论底层数据对象是什么,迭代器只能使用一次。它建立在生成器的概念之上
itertools.tee
可用于从一个迭代器生成多个独立迭代器
l1,l2 = itertools.tee(intList,2)
max(l1)
min(l2)
如果tuple或set-on-map对象比listSo-python3和python2软件更适合您的目的,那么您也可以调用tuple或set-on-map对象?没有向后兼容性?我在尝试重用
gtk.TreeIter
@LuisA.Florit时也遇到了同样的错误:是的,这就是Python 3背后的想法。在这个版本中,他们打破了向后兼容性,改变了不打破向后兼容性就无法改变的东西。@LuisA.Florit:我认为你所做的也不会对Python2起作用-TreeIter听起来像是Python2上的迭代器-但是gtk.TreeIter
文档是奇怪,所以我不确定在任何Python版本中应该如何使用TreeIter。@user2357112supportsMonica:它以前工作过。我甚至有一份ITER的清单,在我的程序中随处可见。它坏得很厉害,我不得不切换到list
,并以“经典”的方式编制索引。