3 回答

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
一直在尋找東西list
。為了弄清楚是否i
在中list
,它必須掃描整個(gè)列表以確保它不存在。如果您確實(shí)只關(guān)心偶數(shù),則可以簡(jiǎn)單地使用if i % 2 == 0
,但是如果您要使用一組特定的行號(hào),則應(yīng)該使用set
具有O(1)成員資格測(cè)試的,例如
keep = {1, 5, 888, 20203}
進(jìn)而
if i in keep:

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
您要花費(fèi)大量的時(shí)間來(lái)創(chuàng)建,然后反復(fù)搜索(在每一行中!?。。﹍ist。只需逐行讀取第一個(gè)文件,然后跳過(guò)其他文件。您可以使用切換標(biāo)志來(lái)執(zhí)行此操作,也可以只檢查行號(hào)是否可以被二整(我認(rèn)為更清晰)。
for i, line in enumerate(file):
if i % 2 == 0:
newfile.write(line)
編輯在回答您的編輯:你的問(wèn)題現(xiàn)在是“如何任意行從文件復(fù)制?” 這很大程度上取決于如何定義這些任意行。答案仍然是絕對(duì)不要使用“需要的”行號(hào)列表,因?yàn)樗阉髟摿斜頃?huì)花費(fèi)很長(zhǎng)時(shí)間,并且您必須在每一行上進(jìn)行搜索。
如果目標(biāo)實(shí)質(zhì)上是要從文件中隨機(jī)選擇行,則可以使用與當(dāng)前設(shè)置類似的方法,但可以使用set代替list來(lái)快速查找。一個(gè)一般情況下證明了概念的解決方案可能是這樣的:
import random
# Pick 5000 random lines
wanted_lines = set(random.sample(range(200000), 5000)) # Use a set!
for i, line in enumerate(file):
if i in wanted_lines: # average-case O(1)
newfile.write(str(line)+'\n')

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊
我假設(shè)您list是預(yù)定義的,并且可以包含任何可能的行索引序列,例如不一定是第N行。
第一個(gè)可能的瓶頸是您要進(jìn)行O(n)列表搜索(i in list)200000次。將列表轉(zhuǎn)換為字典應(yīng)該已經(jīng)有所幫助:
listd = dict.fromkeys(list)
.
.
# this is O(1) instead of O(n)
if i in listd:
或者,如果您知道list已排序,或者可以對(duì)其進(jìn)行排序,只需跟蹤下一行索引:
list = [0, 2, 4, 6, 8, 10..... 199996, 199998]
nextidx = 0
newfile = open(savefile, "w")
with open("foo.txt", "r") as file:
for i, line in enumerate(file):
if i == list[nextidx]:
newfile.write(line)
nextidx += 1
newfile.close()
添加回答
舉報(bào)