亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么這個嵌套的 for 循環在第二個循環中迭代了兩次,之后就完全沒有了?

為什么這個嵌套的 for 循環在第二個循環中迭代了兩次,之后就完全沒有了?

墨色風雨 2022-01-11 16:09:20
我試圖通過下面定義的函數運行它來處理一些數據。它似乎可以很好地運行程序,但是循環不會迭代我期望的次數。我將 return 語句放在哪里似乎并不重要,只要它在函數內部而不是在 if 語句之下。我嘗試在每個 for 循環下獨立編寫行,并在每種情況下寫入預期的行數。def _ManhattanDistance(x,y):    a = 0    for i in range(0,len(x)):        a += abs(float(x[i])-float(y[i]))    return adef _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 行的輸出。
查看完整描述

2 回答

?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

這似乎有效:


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)


查看完整回答
反對 回復 2022-01-11
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

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)


查看完整回答
反對 回復 2022-01-11
  • 2 回答
  • 0 關注
  • 313 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號