![](/img/trans.png)
[英]Why does a for-loop with pop-method (or del statement) not iterate over all list elements
[英]Why does this nested for-loop iterate twice over the second loop, and not at all afterwards?
我正在嘗試通過下面定義的功能運行一些數據。 它似乎在程序中運行得很好,但是循環並沒有迭代我期望的次數。
只要將return語句放在函數內部且不在if語句下,我將return語句放在何處似乎都無關緊要。
我嘗試過在每個for循環下單獨編寫行,並且在每種情況下都會編寫預期的行數。
def _ManhattanDistance(x,y):
a = 0
for i in range(0,len(x)):
a += abs(float(x[i])-float(y[i]))
return a
def _CabFare(x,y,z):
with open(x, 'r') as f:
with open(y, 'r') as g:
with open(z, 'wb') as h:
reader_1 = csv.reader(f)
reader_2 = csv.reader(g)
writer = csv.writer(h)
for row_b in reader_2:
for row_a in reader_1:
if _ManhattanDistance(row_a,row_b) > 0:
writer.writerow(row_a)
writer.writerow(row_b)
return
作為參考,給定我的輸入,reader_1應該有200行,而reader_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)
這似乎可行:
from itertools import product
def _CabFare(x,y,z):
with open(x, 'r') as f, open(y, 'r') as g, open(z, 'wb') as h:
writer = csv.writer(h)
for row_a, row_b in product(csv.reader(f), csv.reader(g)):
if _ManhattanDistance(row_a, row_b) > 0:
writer.writerow(row_a)
writer.writerow(row_b)
速度較慢,但占用的內存較少:
def _CabFare(x,y,z):
with open(x, 'r') as f, open(z, 'wb') as h:
writer = csv.writer(h)
for row_a in csv.reader(f):
with open(y, 'r') as g:
for row_b in csv.reader(g):
if _ManhattanDistance(row_a, row_b) > 0:
writer.writerow(row_a)
writer.writerow(row_b)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.