如何在不覆盖列表的情况下迭代不同的行

2024-06-02 11:32:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要帮助我的脚本-我已经花了很多时间,但无法调整脚本的方式,以提供预期的输出

我有一个以下格式的文件:

>seq1
ACTGTAG #---> 6mers of this line are ACTGTA & CTGTAG
>seq2
ATAGGAG #---> 6mers of this line are ATAGGA & TAGGAG
>seq3
TCCTATT #---> 6mers of this line are TCCTAT & CCTATT

在我的脚本中,我希望以迭代的方式保存行(在脚本中通过过滤器)。我想从“保存”第一行开始,将该寡聚体的所有反向补码6-聚体读入一个列表。在这个示例文件中,我有两个来自第1行的6mer[m1,m2],它们各自的补码应添加到列表2中[c1,c2](script does this reverse complement conversion correctly),当在seq2上迭代时,脚本首先应查看[c1,c2]中是否有任何一个在seq2中,如果是,则应丢弃seq2,否则应保存第2行各自的6mer补码[c3,c4]应添加到列表2中,更新后的列表2应为[c1、c2、c3、c4]

问题是在第三次迭代之后,list1将包含[m1,m2,m3],list2将包含[c1,c1,c2,c1,c2,c3],当我在9000行文件上运行这个脚本时,这会造成一个大问题。如果你能帮我做这件事就太好了

我的代码是:

from Bio import SeqIO
from Bio.Seq import Seq

with open('test.fa', 'r') as file:
    list1 = []
    list2 = []
    for record in SeqIO.parse(file, 'fasta'):
        for i in range(len(record.seq)):
            kmer = str(record.seq[i:i + 6]) #gets 6 alphabet blocks (6mers)
            if len(kmer) == 6:
                list1.append(kmer)
        #print(record.seq)
        #print(list1)
         
        # reverse complement of 6mers and appends to the list2
        for kmers in list:
            C_kmer = Seq(kmers).complement()
            list2.append(C_kmer[::-1])
            # print(list2)

        cnt = 0
        if any(items in record.seq for items in list2):
            cnt += 1

        if cnt == 0:
            print('>' + record.id)
            print(record.seq)

print(list2)

所需输出应为: (因为这些行[c1、c2、c3、c4]内没有任何反向补码6mers,但seq3有)

>seq1
ACTGTAG 
>seq2
ATAGGAG

清单2应为:

[Seq('TACAGT'), Seq('CTACAG'),Seq('TCCTAT'), Seq('CTCCTA'), Seq('ATAGGA'), Seq('AATAGG')]

但目前,我的列表2如下所示,这是错误的-它重复了前面提到的一些反向补码6mers

[Seq('TACAGT'), Seq('CTACAG'), Seq('TACAGT'), Seq('CTACAG'), Seq('TCCTAT'), Seq('CTCCTA'), Seq('TACAGT'), Seq('CTACAG'), Seq('TCCTAT'), Seq('CTCCTA'), Seq('ATAGGA'), Seq('AATAGG')]

Tags: ofin脚本列表thisrecordseqprint
1条回答
网友
1楼 · 发布于 2024-06-02 11:32:53

我认为这应该行得通——这是我自己的答案,请给出您的意见

with open('file.fasta', 'r') as file:
    list = []
    for record in SeqIO.parse(file, 'fasta'):

        cnt = 0
        if any(items in record.seq for items in list):
            cnt += 1
            pass
        else:
            for i in range(len(record.seq)):
                kmer = str(record.seq[i:i + 6])
                if len(kmer) == 6:
                    C_kmer = Seq(kmer).complement()
                    list.append(C_kmer[::-1])

        if cnt == 0:
            print('>' + record.id)
            print(record.seq)

相关问题 更多 >