如何在Python中的列表上循环两次

时间:2017-12-01 04:06:00

标签: python list for-loop

我有一个包含CSV内容的字符串。我把它变成了这样一个列表:

from StringIO import StringIO
import csv

f = StringIO(list_csv)
my_list = csv.reader(f, delimiter=',')

现在我想在列表上循环两次,但是第二次尝试循环时,代码就像列表为空一样:

for item in my_list:
    code = item[1]
    print "code: "+code

for item in my_list:
    desc = item[2]
    print "desc: "+desc

(此代码为了演示目的而简化,我无法在单个循环中组合执行)

我认为列表仍然附加到StringIO,当它完成循环时它已完成读取,因此它不会再次读取。是否有一个单行将其转换为内存中的常规列表,我可以循环多次?我觉得像手动循环复制值是重新发明轮子....但如果没有其他选择,我可以这样做。只是要求代码不那么冗长的代码。谢谢!

3 个答案:

答案 0 :(得分:4)

问题是my_list实际上不是列表。它是iterator(在这种特殊情况下实际上是reader object,它只是一种迭代器)。

在第一次产生所有值之后消耗迭代器。这就是mylist发生的事情:在你第一次循环之后,读者对象已经被消耗掉了,不能再次迭代了。

一种解决方案是将内容存储在实际的list对象中。这应该解决它:

my_list = list(csv.reader(f, delimiter=','))

...然后像以前一样继续。

顺便说一句,如果您使用的是最新版本的Python 3,那么可以使用非常好的语法将迭代器解压缩到列表中:

my_list = [*csv.reader(f, delimiter=',')]

答案 1 :(得分:0)

使用以下代码:

my_list = list(csv.reader(f, delimiter=','))

答案 2 :(得分:0)

在itertools中使用tee函数,它可以为您提供对迭代器的更多访问,而不仅仅是一次。

from itertools import tee

i1, i2 = tee(my_list)

for i in i1:
    pass

for i in i2:
    pass