簡體   English   中英

為什么此嵌套的for循環在第二個循環中重復兩次,而之后又不重復呢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM