Python 为什么这个嵌套的for循环在第二个循环上迭代两次,之后就完全没有了?

Python 为什么这个嵌套的for循环在第二个循环上迭代两次,之后就完全没有了?,python,csv,Python,Csv,我试图通过下面定义的函数来处理一些数据。它似乎在程序中运行得很好,但循环并没有达到我预期的迭代次数 我把return语句放在哪里似乎无关紧要,只要它在函数内部而不是if语句下面 我尝试在每个for循环下独立地写行,它在每种情况下都会写预期的行数 def_曼哈顿立场(x,y): a=0 对于范围(0,len(x))中的i: a+=abs(浮动(x[i])-浮动(y[i])) 归还 定义(x,y,z): 开放式(x,'r')作为f: 开放式(y,'r')为g: 打开(z,'wb')作为h: 读取器_

我试图通过下面定义的函数来处理一些数据。它似乎在程序中运行得很好,但循环并没有达到我预期的迭代次数

我把return语句放在哪里似乎无关紧要,只要它在函数内部而不是if语句下面

我尝试在每个for循环下独立地写行,它在每种情况下都会写预期的行数

def_曼哈顿立场(x,y):
a=0
对于范围(0,len(x))中的i:
a+=abs(浮动(x[i])-浮动(y[i]))
归还
定义(x,y,z):
开放式(x,'r')作为f:
开放式(y,'r')为g:
打开(z,'wb')作为h:
读取器_1=csv.reader(f)
读取器_2=csv.reader(g)
writer=csv.writer(h)
对于读取器_2中的第_b行:
对于读取器_1中的行_a:
如果曼哈顿立场(a行、b行)>0:
writer.writerow(a行)
writer.writerow(第b行)
返回

作为参考,给定我的输入,读卡器_1应该有200行,读卡器_2应该有17145行。如果我们的包含阈值为零,我希望输出文件中有17145*200=3429000行—我得到的是一个400行的输出。

reader
是一个有状态迭代器。一旦您耗尽它,它就完成了,您需要重新打开它以便再次迭代该文件:

def _CabFare(x,y,z):
    with open(x, 'r') as f:
        with open(y, 'r') as g:
            with open(z, 'wb') as h:
                reader_2 = csv.reader(g)
                writer = csv.writer(h)
                for row_b in reader_2:
                    reader_1 = csv.reader(f) # Reopen reader_1 for each iteration
                    for row_a in reader_1:
                        if _ManhattanDistance(row_a,row_b) > 0:
                            writer.writerow(row_a)
                            writer.writerow(row_b)

reader
是一个有状态迭代器。一旦您耗尽它,它就完成了,您需要重新打开它以便再次迭代该文件:

def _CabFare(x,y,z):
    with open(x, 'r') as f:
        with open(y, 'r') as g:
            with open(z, 'wb') as h:
                reader_2 = csv.reader(g)
                writer = csv.writer(h)
                for row_b in reader_2:
                    reader_1 = csv.reader(f) # Reopen reader_1 for each iteration
                    for row_a in reader_1:
                        if _ManhattanDistance(row_a,row_b) > 0:
                            writer.writerow(row_a)
                            writer.writerow(row_b)
这似乎有效:

来自itertools导入产品的

定义(x,y,z):
开放式(x,'r')表示f,开放式(y,'r')表示g,开放式(z,'wb')表示h:
writer=csv.writer(h)
对于产品(csv.reader(f)、csv.reader(g))中的a行、b行:
如果曼哈顿立场(a行、b行)>0:
writer.writerow(a行)
writer.writerow(第b行)
速度较慢,但内存占用较少:

def_CabFare(x,y,z):
开放式(x,'r')为f,开放式(z,'wb')为h:
writer=csv.writer(h)
对于csv.reader(f)中的a行:
开放式(y,'r')为g:
对于csv.reader(g)中的b行:
如果曼哈顿立场(a行、b行)>0:
writer.writerow(a行)
writer.writerow(第b行)
这似乎有效:

来自itertools导入产品的

定义(x,y,z):
开放式(x,'r')表示f,开放式(y,'r')表示g,开放式(z,'wb')表示h:
writer=csv.writer(h)
对于产品(csv.reader(f)、csv.reader(g))中的a行、b行:
如果曼哈顿立场(a行、b行)>0:
writer.writerow(a行)
writer.writerow(第b行)
速度较慢,但内存占用较少:

def_CabFare(x,y,z):
开放式(x,'r')为f,开放式(z,'wb')为h:
writer=csv.writer(h)
对于csv.reader(f)中的a行:
开放式(y,'r')为g:
对于csv.reader(g)中的b行:
如果曼哈顿立场(a行、b行)>0:
writer.writerow(a行)
writer.writerow(第b行)

我认为,我们需要查看一些示例数据来了解发生了什么。FWIW,我认为这里根本不需要
return
语句。数据集的元素是相当长的向量,我有一种感觉,包括其中一些可能会比不包括它们更令人困惑。关于第二个return语句,您是对的-它现在被丢弃了。谢谢我想,我们需要看一些样本数据来了解发生了什么。FWIW,我认为这里根本不需要
return
语句。数据集的元素是相当长的向量,我有一种感觉,包括其中一些可能会比不包括它们更令人困惑。关于第二个return语句,您是对的-它现在被丢弃了。谢谢@DirtyBit肯定可以,但这对OP的问题无关紧要,所以我不想碰它。我尝试实现了这段代码,但我仍然只得到了400行回音。@DirtyBit肯定可以,但这对OP的问题无关紧要,所以我不想碰它。我尝试实现了这段代码,我现在只回了400行。不过这可能会让我记忆犹新。你介意解释一下为什么这两个版本之间有差异吗?据我所知,带容器的
csv.reader
行生成器一次只加载一行,因此这两个版本对我来说都相当等效和高效。第一个版本使用
itertools.product()
并且只读取两个输入文件一次-至少在内存中保存其中一个。第二行重新读取第一行中每行的第二个CSV。大量的重复读取正在进行,但它一次只能在内存中保存2行,所以内存使用率很低。谢谢。这段代码似乎有点接近——输出中的行数是我预期的两倍。我会试图找出原因,但这似乎已经足够接近我要找的了。谢谢!我们正在为两个输入文件中的每一行组合编写两行-可能是这样吗?可能会占用一些内存。您介意解释一下为什么这两个版本之间存在差异吗?据我所知,带
容器的
csv.reader
行生成器一次只加载一行,因此这两个版本对我来说都相当等效和高效。第一个版本使用
itertools.product()
并且只读取两个输入文件一次-至少在内存中保存其中一个。第二行重新读取第一行中每行的第二个CSV。大量重复读取正在进行,但它一次只能在内存中保存2行,因此内存较低