gpt4 book ai didi

python - python 获取不匹配的行号

转载 作者:行者123 更新时间:2023-12-01 05:01:02 26 4
gpt4 key购买 nike

嗨,我用 python 编写了一个简单的代码来执行以下操作:

我有两个总结基因组数据的文件。第一个文件包含我想要删除的基因座的名称,它看起来像这样

文件_1:

R000002
R000003
R000006

第二个文件包含我所有基因座的名称和位置,如下所示:

文件_2:

R000001 1
R000001 2
R000001 3
R000002 10
R000002 2
R000002 3
R000003 20
R000003 3
R000004 1
R000004 20
R000004 4
R000005 2
R000005 3
R000006 10
R000006 11
R000006 123

我想要做的是从 File2 中获取 File1 中不存在的所有对应行号,所以最终结果应该如下所示:

结果:

1
2
3
9
10
11
12
13

我编写了以下简单的代码,它完成了工作

#!/usr/bin/env python

import sys

File1 = sys.argv[1]
File2 = sys.argv[2]

F1 = open(File1).readlines()
F2 = open(File2).readlines()
F3 = open(File2 + '.np', 'w')
Loci = []

for line in F1:
Loci.append(line.strip())

for x, y in enumerate(F2):
y2 = y.strip().split()
if y2[0] not in Loci:
F3.write(str(x+1) + '\n')

但是,当我在真实数据集上运行此命令时,第一个文件有 58470 行,第二个文件有 12881010 行,这似乎需要很长时间。我猜测瓶颈在于

if y2[0] not in Loci:

代码必须重复搜索整个 File_2 的部分,但我无法找到更快的解决方案。

任何人都可以帮助我并展示一种更Pythonic的做事方式吗?

提前致谢

最佳答案

这里有一些稍微Pythonic 的代码,它不关心你的文件是否有序。我更愿意打印所有内容并将其重定向到文件 ./myscript.py > outfile.txt,但您也可以传入另一个文件名并写入该文件。

#!/usr/bin/env python
import sys

ignore_f = sys.argv[1]
loci_f = sys.argv[2]

with open(ignore_f) as f:
ignore = set(x.strip() for x in f)

with open(loci_f) as f:
for n, line in enumerate(f, start=1):
if line.split()[0] not in ignore:
print n

在列表中搜索某个内容的时间复杂度为 O(n),而在集合中搜索内容只需 O(1)。如果顺序并不重要并且您有独特的东西,请在列表上使用set。虽然这不是最佳的,但它应该是 O(n) 而不是像您的代码那样的 O(n × m)。

您也没有关闭文件,这在读取时并不是什么大问题,但在写入时则很重要。我使用上下文管理器(with),所以 Python 为我做到了这一点。

在风格上,使用描述性变量名称。并避免使用 UpperCase 名称,这些名称通常用于类(请参阅 PEP-8 )。

如果您的文件已排序,您可以一起单步执行它们,忽略基因座名称相同的行,然后当它们不同时,在忽略文件中采取另一步骤并重新检查。

关于python - python 获取不匹配的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26209952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com