在python中嵌套for循环(列表理解);外部循环不循环

2024-07-04 17:19:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图比较来自两个不同文件的列的数据。我试图使用for,现在是list comprehension。在

问题是外部的for循环没有被迭代,但是内部的循环是循环的。我已经单独检查过了,迭代就可以了;但是一旦我嵌套了,我就会遇到这个问题。我有什么遗漏吗?在

import csv

newInv  = csv.reader(open("new.csv", "r"))
origInv = csv.reader(open("old.csv", "r"))

print [ oldrow[5] + " " + newrow[3]  for oldrow in origInv for newrow in newInv ]

Tags: 文件csv数据inimportforopenlist
3条回答

这里有两件事。在

1)你的列表理解有两次迭代。从概念上讲,您要求对每个oldrow重新迭代newInv。在

2)您没有看到(oldRow,newRow)的每一个组合的原因是csv.reader是一个,因此只能迭代一次。在newInv上的每个后续“迭代”都不会找到新的项,因为它们都在第一次“用完”。在

要获得(旧行、新行)的每个组合,请首先从每个csv.reader中形成lists(可以直接将它们传递给list构造函数。在

要获得(旧行、新行)的一个成对组合序列,zip将两个csv.reader组合在一起。在

请注意,在您的解决方案中,for循环是嵌套的,所以这就是为什么一个循环似乎在迭代,而另一个似乎没有。在

一次获取两个迭代器的一个元素需要使用itertools.izip

[ oldrow[5] + " " + newrow[3]
for oldrow, newrow in itertools.izip(origInv, newInv)]

外部循环。但是,只对外循环的第一次迭代执行内循环-然后到达newInv的结尾。在

要明白newInv不是一个可以多次迭代的集合。它是一个只能使用一次的迭代器。尝试(未测试):

newInv  = list(csv.reader(open("new.csv", "r")))
origInv = list(csv.reader(open("old.csv", "r")))

它将把数据复制到内存中,并允许您进行多次迭代。在

相关问题 更多 >

    热门问题