3 回答
TA贡献1793条经验 获得超6个赞
一直在寻找东西list
。为了弄清楚是否i
在中list
,它必须扫描整个列表以确保它不存在。如果您确实只关心偶数,则可以简单地使用if i % 2 == 0
,但是如果您要使用一组特定的行号,则应该使用set
具有O(1)成员资格测试的,例如
keep = {1, 5, 888, 20203}
进而
if i in keep:
TA贡献1796条经验 获得超4个赞
您要花费大量的时间来创建,然后反复搜索(在每一行中!!!)list。只需逐行读取第一个文件,然后跳过其他文件。您可以使用切换标志来执行此操作,也可以只检查行号是否可以被二整(我认为更清晰)。
for i, line in enumerate(file):
if i % 2 == 0:
newfile.write(line)
编辑在回答您的编辑:你的问题现在是“如何任意行从文件复制?” 这很大程度上取决于如何定义这些任意行。答案仍然是绝对不要使用“需要的”行号列表,因为搜索该列表会花费很长时间,并且您必须在每一行上进行搜索。
如果目标实质上是要从文件中随机选择行,则可以使用与当前设置类似的方法,但可以使用set代替list来快速查找。一个一般情况下证明了概念的解决方案可能是这样的:
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贡献1757条经验 获得超8个赞
我假设您list是预定义的,并且可以包含任何可能的行索引序列,例如不一定是第N行。
第一个可能的瓶颈是您要进行O(n)列表搜索(i in list)200000次。将列表转换为字典应该已经有所帮助:
listd = dict.fromkeys(list)
.
.
# this is O(1) instead of O(n)
if i in listd:
或者,如果您知道list已排序,或者可以对其进行排序,只需跟踪下一行索引:
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()
添加回答
举报