Python嵌套用于in循环-最外层循环不迭代

Python嵌套用于in循环-最外层循环不迭代,python,csv,Python,Csv,这个简单的问题不确定出了什么问题,但是:我正在尝试遍历从csv文件读取的两个列表,如下所示: for row1 in (list(csv_data1)): for row2 in (list(csv_data2)): # do something with row2 and row2 但是,在外部for循环的每次迭代之后,内部for循环都无法识别外部for循环是迭代的!例如,如果我这样做: for row1 in (list(csv_data1)): for row2 in (

这个简单的问题不确定出了什么问题,但是:我正在尝试遍历从csv文件读取的两个列表,如下所示:

for row1 in (list(csv_data1)):
  for row2 in (list(csv_data2)):
    # do something with row2 and row2
但是,在外部for循环的每次迭代之后,内部for循环都无法识别外部for循环是迭代的!例如,如果我这样做:

for row1 in (list(csv_data1)):
  for row2 in (list(csv_data2)):
    # do something with row2 and row2
  print row1
正确打印第1行的元素。但是,如果我尝试在内部循环中打印最外层循环的元素,如下所示:

for row1 in (list(csv_data1)):
   for row2 in (list(csv_data2)):
     # do something with row2 and row2
     print row1
我只多次获得
(列表(csv_data1))
的第一行

因此,例如,如果
csv_data1=[['a','b',['b','c']]
,我希望上面的打印语句(在内部循环中打印)打印:

[['a','b']
# repeated prints of above for however long csv_data2 is ...
['b','c']]
# repeated prints of above for however long csv_data2 is ...
但我得到的是以下信息:

[['a','b']
# repeated prints of above for however long csv_data2 is ...
['a','b']]
# repeated prints of above for however long csv_data2 is ...
也就是说,我不能让两个循环互相迭代。我错过了一些非常明显的东西,任何帮助都将不胜感激。谢谢

编辑:更具体地说,这里是我正在尝试做的:(我现在只是打印以尝试诊断问题)
我认为您需要将生成器放入所需的调用列表中

desired_cols_1 = [ [row[col] for col in cols_desired] for row in reader1 ]
desired_cols_2 = [ [row[col] for col in cols_desired] for row in reader2 ]

for row1 in desired_cols_1:
    for row2 in desired_cols_2:
        print row1
我的文件_1.csv:

district,blockname,villagename
a,b,c
e,f,g
我的文件_2.csv:

district,blockname,villagename
1,1,1
2,2,2
3,3,3
输出:

['a', 'b', 'c']
['a', 'b', 'c']
['a', 'b', 'c']
['e', 'f', 'g']
['e', 'f', 'g']
['e', 'f', 'g']

当然,它将打印行1 x次,其中x是len(所需的列数)。这不是您使用嵌套for循环所尝试的吗?

在任何编程语言中,for循环都需要注意的一点是,您只需重复10次,即执行for循环中相同的语句/函数,直到循环结束

for i in ['a','b','c','d']:
    for j in ["hello"]:
        print(j)
输出

hello
hello
hello
hello
因此,您可以通过在第二个for循环开始之前放置print语句来防止重复

for row1 in (list(desired_cols_1)):
    print row1   
    for row2 in (list(desired_cols_2)):

问题是,您正在为内部循环使用生成器。在生成器上迭代一次后,生成器将为空。因此,在第一个循环中,您使用
csv_data2
的所有元素,然后对于以下所有循环,它都是空的

看看这个:

>>> x = (i for i in range(5))
>>> y = (i for i in range(5))
>>> for i in x:
...     ylist = list(y)
...     print(id(ylist))
...     print(len(ylist))
...
44917584
5
44917624
0
44918104
0
44918144
0
44918184
0
>>> print(len(list(x)))
0
每次迭代都会创建一个新列表,在除第一次迭代之外的所有迭代中,
ylist
为空。这是因为第一次迭代在创建
列表时会消耗生成器的元素。在
x
上也有类似的效果:在
for
循环之后也是空的。这就是你看到的

解决方案是在循环之前创建
列表
s

# Square brackets make this a list comprehension instead of a raw generator
# List comprehension gives back a list
desired_cols_1 = [list(row[col]) for col in cols_desired) for row in reader1]
desired_cols_2 = [list(row[col]) for col in cols_desired) for row in reader2]

for row1 in desired_cols_1:
  for row2 in desired_cols_2:
    print row1, row2
这只会消耗发电机一次

或者,如果数据太大,无法将其全部加载到内存中,则可以为每次迭代创建一个新的生成器,而不是在循环之前创建内部生成器:

desired_cols_1 = (list(row[col]) for col in cols_desired) for row in reader1)

for row1 in desired_cols_1:
  # Need to make sure the reader is back at the beginning
  reader2.seek(0)
  desired_cols_2 = (list(row[col]) for col in cols_desired) for row in reader2)
  for row2 in desired_cols_2:
    print row1, row2

如果没有更具体地查看代码,则很难诊断此问题。您是否在内部for循环中执行其他操作,或者只是打印?向我们显示最内部循环中引用csv_data1的所有行,您必须对其进行修改,否则内部循环尚未真正结束。您好,感谢您的回复。我已经更新了更具体的代码。不,我没有修改我相信的任何东西,只是尝试在内部循环中打印第1行中的每个元素,但是得到了原始帖子中不希望出现的行为。谢谢你的回答。是的,这就是我目前正在努力做的。您的代码设法遍历所需的列1,而不仅仅是第一行,这很好,但是它陷入了这个无限循环,当行1=所需列的最后一行时,它应该停止打印。你知道会出什么问题吗?是不是在所需的列2中有很多行,而控制台的输出还没有跟上?什么是len(期望值)?你能在我添加的测试数据上试用一下吗?是的,你的测试数据有效:)所以问题出在我的csv文件上。所需的_cols_2的长度为3,与所需的_cols_1相同。。。但是csv中有很多数据,谢谢你的帮助。
desired_cols_1 = (list(row[col]) for col in cols_desired) for row in reader1)

for row1 in desired_cols_1:
  # Need to make sure the reader is back at the beginning
  reader2.seek(0)
  desired_cols_2 = (list(row[col]) for col in cols_desired) for row in reader2)
  for row2 in desired_cols_2:
    print row1, row2