msb*_*msb 2 python for-loop list
我有一个包含CSV内容的字符串。我把它变成了这样的列表:
from StringIO import StringIO
import csv
f = StringIO(list_csv)
my_list = csv.reader(f, delimiter=',')
Run Code Online (Sandbox Code Playgroud)
现在,我想遍历该列表两次,但是第二次尝试遍历该代码,就像遍历列表一样:
for item in my_list:
code = item[1]
print "code: "+code
for item in my_list:
desc = item[2]
print "desc: "+desc
Run Code Online (Sandbox Code Playgroud)
(此代码出于演示目的而简化,我无法在单个循环中合并执行)
我认为该列表仍附加在StringIO上,并且在完成循环后,它已经完成读取,因此不会再次读取。是否有一个单行将其转换为内存中的常规列表,我可以循环几次?我感觉像是运行一个循环来手动复制值正在重新发明轮子....但是如果没有其他选择,我可以这样做。只是要求一些不太冗长的代码。谢谢!
问题是my_list实际上不是列表。它是一个迭代器(在这种情况下实际上是一个阅读器对象,只是一种迭代器)。
第一次产生所有值后,将消耗迭代器。这就是发生的情况mylist:第一次循环浏览器后,阅读器对象已被消耗,无法再次进行迭代。
一种解决方案是将内容存储在实际list对象中。这应该解决它:
my_list = list(csv.reader(f, delimiter=','))
Run Code Online (Sandbox Code Playgroud)
...然后像以前一样进行。
顺便说一下,如果您使用的是最新版本的Python 3,则有一种非常不错的语法可用于将迭代器解压缩到列表中:
my_list = [*csv.reader(f, delimiter=',')]
Run Code Online (Sandbox Code Playgroud)