Как получить количество дублированных последовательностей в файле fasta, используя python - PullRequest
1 голос
/ 18 марта 2019

У меня есть файл фаста, подобный этому: test_fasta.fasta

>XXKHH_1
AAAAATTTCTGGGCCCC
>YYYXXKHH_1
TTAAAAATTTCTGGGCCCCGGGAAAAAA
>TTDTT_11
TTTGGGAATTAAACCCT
>ID_2SS
TTTGGGAATTAAACCCT
>YKHH_1
TTAAAAATTTCTGGGCCCCGGGAAAAAA
>YKHSH_1S
TTAAAAATTTCTGGGCCCCGGGAAAAAA

Я хочу получить количество дублированных последовательностей и добавить общее количество для каждой последовательности в файле (отсортировано от наибольшего к меньшему) и получить результат, как показано ниже:

>YYYXXKHH_1_counts3
TTAAAAATTTCTGGGCCCCGGGAAAAAA
>TTDTT_11_counts2
TTTGGGAATTAAACCCT
>XXKHH_1_counts1
AAAAATTTCTGGGCCCC

У меня есть этот код, который находит дублированные последовательности и объединяет их идентификаторы вместе, но вместо того, чтобы объединять их вместе, я просто хочу, чтобы счетчики для дубликатов добавлялись видентификатор, как показано выше в результатах.

from Bio import SeqIO
from collections import defaultdict

dedup_records = defaultdict(list)
for record in SeqIO.parse("test_fasta.fasta", "fasta"):
    # Use the sequence as the key and then have a list of id's as the value
    dedup_records[str(record.seq)].append(record.id)
with open("Output.fasta", 'w') as output:
    for seq, ids in dedup_records.items():
        # Join the ids and write them out as the fasta
        output.write(">{}\n".format('|'.join(ids)))
        output.write(seq + "\n")

1 Ответ

1 голос
/ 18 марта 2019

Поскольку у вас уже есть идентификаторы каждой дублирующейся записи в списке ids в цикле вывода, вы можете просто вывести первый идентификатор (который вы, очевидно, хотите, для ожидаемого результата), а затем длину ids список:

for seq, ids in sorted(dedup_records.items(), key=lambda t: len(t[1]), reverse=True):
    output.write(">{}_counts{}\n".format(ids[0], len(ids)))
    output.write(seq + "\n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...