Привет я написал простой код в Python, чтобы сделать следующее:получить номера без согласования линии питона
У меня есть два файла, обобщающие геномных данных. Первый файл имеет имена локусов, которые я хочу, чтобы избавиться от, это выглядит примерно так
file_1:
R000002
R000003
R000006
второй файл имеет имена и положение всех моих локусов и выглядит следующим образом:
file_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
То, что я хочу сделать, это получить все соответствующие номера строк локусов из Файл2, которые не 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 неоднократно, но я не смог найти более быстрое решение.
Может кто-нибудь помочь мне и показать более питонический способ делать что-то.
Заранее спасибо
Ваши файлы заказываются? –
да, они оба заказаны. Однако только некоторые из локусов в File2 находятся в File_1, а File1 не идет последовательно. Значение в File_1 вы можете перейти с R00на R000255. – iksaglam
Для начала вы можете сделать 'Loci' в' set' вместо 'list'. Это наверняка улучшит время поиска. – sberry