第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

有效地將特定行復(fù)制到另一個(gè)文件(Python 3.3)

有效地將特定行復(fù)制到另一個(gè)文件(Python 3.3)

如何在Python中將所有偶數(shù)行從一個(gè)文件復(fù)制到新文件?當(dāng)我希望從一個(gè)文件復(fù)制到另一個(gè)文件時(shí)要選擇大量的行時(shí),偶數(shù)只是一個(gè)例證,但作為示例應(yīng)該很好。我用這個(gè),但是效率很低(大約需要5分鐘):# foo.txt holds 200,000 lines with 300 valueslist = [0, 2, 4, 6, 8, 10..... 199996, 199998]newfile = open(savefile, "w")with open("foo.txt", "r") as file:    for i, line in enumerate(file):        if i in list:            newfile.write(line)newfile.close()如果有一個(gè)解釋為什么它這么慢,我也將不勝感激:逐行閱讀很快(大約15秒),并且手冊(cè)也建議這樣做。
查看完整描述

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:


查看完整回答
反對(duì) 回復(fù) 2021-03-30
?
SMILET

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')


查看完整回答
反對(duì) 回復(fù) 2021-03-30
?
陪伴而非守候

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()


查看完整回答
反對(duì) 回復(fù) 2021-03-30
  • 3 回答
  • 0 關(guān)注
  • 400 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)