Вы можете подойти к своей проблеме, чтобы найти эти пары и сравнить строки следующим образом:
#create a dictionary to store pairs
line_dict = {}
#iterate over your file
for line in open("test.txt", "r"):
line = line[:-1].split("\t")
#ignore line, if not at least one value apart from the two sequence IDs
if len(line) < 3:
continue
#identify the two sequences
seq = tuple(line[0:2])
#is reverse sequence already in dictionary?
if seq[::-1] in line_dict:
#append new line
line_dict[seq[::-1]].append(line)
else:
#create new entry
line_dict[seq] = [line]
#remove entries, for which no counterpart exists
pairs = {k: v for k, v in line_dict.items() if len(v) > 1}
#and do things with these pairs
for pair, seq in pairs.items():
print(pair, "found in:")
for item in seq:
print(item)
Преимущество заключается в том, что вам нужно только один раз перебрать файл, потому что вы сохраняете все данные и отбрасываете их только в том случае, если вы не нашли подходящую обратную пару. Недостатком является то, что это требует места, поэтому для очень больших файлов этот подход может оказаться неприемлемым.
Аналогичный подход — хранить все данные в рабочей памяти — использует pandas. Это должно быть быстрее, так как алгоритмы сортировки оптимизированы для панд. Еще одно преимущество pandas заключается в том, что все ваши другие значения уже находятся в столбцах pandas, поэтому дальнейший анализ упрощается. Я определенно предпочитаю версию для панд, но я не знаю, установлена ли она в вашей системе. Чтобы упростить общение, я присвоил a
и b
столбцам, содержащим последовательности Seq1
и Seq2
.
import pandas as pd
#read data into a dataframe
#not necessary: drop the header of the file, use custom columns names
df = pd.read_csv("test.txt", sep='\t', names=list("abcde"), header = 0)
#create a column that joins Seq1 - Seq2 or Seq2 - Seq1 to Seq1Seq2
df["pairs"] = df.apply(lambda row: ''.join(sorted([row["a"], row["b"]])), axis = 1)
#remove rows with no matching pair and sort the database
only_pairs = df[df["pairs"].duplicated(keep = False)].sort_values(by = "pairs")
print(only_pairs)
person
Mr. T
schedule
06.02.2018