繁体   English   中英

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

[英]How to iterate over different lines without overwriting a list Python

我的脚本需要帮助 - 我花了很多时间,但无法调整脚本以提供预期的 output。

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

>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-mer 读入一个列表。 在这个示例文件中,我有来自 line1 的两个 6mers [m1,m2] 并且它们各自的补码应该被添加到 list2 [c1,c2] (script does this reverse complement conversion correctly)并且当迭代 seq2 时 - 脚本首先应该查看 [c1,c2] 中是否有任何 [c1,c2] 如果是,则应丢弃 seq2,否则应保存 line2 的相应 6mer 补码 [c3,c4] 应添加到 list2 中,更新后的 list2 应为 [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)

所需的 output 应该是:(因为这些行在 [c1,c2,c3,c4] 内没有任何反向补码 6mer,但 seq3 有)

>seq1
ACTGTAG 
>seq2
ATAGGAG

list2 应该是:

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

但目前,我的 list2 如下所示,这是错误的 - 如前所述,它重复了一些反向补码 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')]

我认为这应该可行-这是我自己的答案,请提供您的意见

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM