繁体   English   中英

按“>名称”和“序列”组织字符串列表。 蟒蛇

[英]Organizing list of strings by '>names' and 'sequences'. Python

所以我有一个从文件中读取的字符串列表(查询)。 我想将所有以“>”开头的行添加到名为name_list的列表中,并将其后的所有字母字符(但在下一个“>”行之前)添加到列表中。 关于集合论,这是我之前必须面对的非常相似的问题,但是当我尝试操纵while循环时 ,它陷入了无限反馈循环中……

这是字符串列表的示例

query = [">mm10_refGene_NM_001011532 range=chr2:86084810-86085854 5'pad=0 3'pad=0 strand=- repeatMasking=none", 'caatgcctttgcctcactgataatttctattagtcttatcttatttcatt', 'ttactttgcagctgttaagacttgatgaaATGGCTGGAAGCAATGCCACT', 'GGTGTGACAGAATTCATTCTCTTGGGGTTTGCAGTCCAGAGAGAGGTAGA',">mm10_refGene_NM_001011534 range=chr2:85352995-85353924 5'pad=0 3'pad=0 strand=- repeatMasking=none", 'ATGGAACAAAGTAATGACACCAAAGTGACTGAATTCATTCTTCTGGGATT', 'TTCCGGACAGCACAAATCTTGGCACATTCTGTTCATAATATTTCTAATGA', 'TCTATGTTGTCACACTCATGGGTAACATTGGAATGATCGTACTCATCAAA']

这是我一直在使用的代码:

name_list = []
seq_list = []

for line in query:

    while line.startswith(">"):
        name=line
        temp_seq=[]

        for line in query:
            if line.isalpha()==True:
                temp_seq.append(line)


            else:
                break
        name_list.append(name)
        seq_list.append(''.join(temp_seq))

输出数据示例:

name_list = [">mm10_refGene_NM_001011532 range=chr2:86084810-86085854 5'pad=0 3'pad=0 strand=- repeatMasking=none",">mm10_refGene_NM_001011534 range=chr2:85352995-85353924 5'pad=0 3'pad=0 strand=- repeatMasking=none"]

seq_list = ['caatgcctttgcctcactgataatttctattagtcttatcttatttcattttactttgcagctgttaagacttgatgaaATGGCTGGAAGCAATGCCACTGGTGTGACAGAATTCATTCTCTTGGGGTTTGCAGTCCAGAGAGAGGTAGA','ATGGAACAAAGTAATGACACCAAAGTGACTGAATTCATTCTTCTGGGATTTTCCGGACAGCACAAATCTTGGCACATTCTGTTCATAATATTTCTAATGATCTATGTTGTCACACTCATGGGTAACATTGGAATGATCGTACTCATCAAA']

抱歉,这类似于(从行列表中搜索单词(从单词列表中)并将值追加到新列表中。Python )并且以任何方式都是多余的,但是我认为这对帮助人们将是一个很好的问题谁处理这种类型的数据。

name_list = []
seq_list = []

lines = iter(query)
for line in lines:
    while line.startswith(">"):
        name = line
        temp_seq = []
        for line in lines:
            if line.isalpha():
                temp_seq.append(line)
            else:
                break
        name_list.append(name)
        seq_list.append(''.join(temp_seq))

这是对代码的修改,它一次遍历查询的各个元素:

name_list = []
seq_list = []

seq = ""
for line in query:
    if line.startswith('>'):
        if seq:
            seq_list.append(seq)
            seq = ""
        name_list.append(line)
    elif line.isalpha():
        seq = seq + line
seq_list.append(seq)

但是,在您提供的示例中, query具有一致的“名称”模式,后跟3个“序列”。 如果您的数据始终遵循这种一致的模式,那么这是另一种方式。 您可以定义一个名为grouper的函数( 取自itertools docs ),该函数可让您一次读取4个query元素。

from itertools import izip_longest

def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

现在,对于query每个4个元素“块”,您将第一个元素附加到“名称”,然后将最后三个元素连接起来,附加到“序列”:

names = []
sequences = []

for chunk in grouper(4, query):
    names.append(chunk[0])
    sequences.append(''.join(chunk[1:]))

print names
print sequences

输出:

[">mm10_refGene_NM_001011532 range=chr2:86084810-86085854 5'pad=0 3'pad=0 strand=- repeatMasking=none", ">mm10_refGene_NM_001011534 range=chr2:85352995-85353924 5'pad=0 3'pad=0 strand=- repeatMasking=none"]
['caatgcctttgcctcactgataatttctattagtcttatcttatttcattttactttgcagctgttaagacttgatgaaATGGCTGGAAGCAATGCCACTGGTGTGACAGAATTCATTCTCTTGGGGTTTGCAGTCCAGAGAGAGGTAGA', 'ATGGAACAAAGTAATGACACCAAAGTGACTGAATTCATTCTTCTGGGATTTTCCGGACAGCACAAATCTTGGCACATTCTGTTCATAATATTTCTAATGATCTATGTTGTCACACTCATGGGTAACATTGGAATGATCGTACTCATCAAA']

您可以使用itertools.groupby非常简单地执行此操作:

from itertools import groupby

def name_seq_chunks(seq): 
    isheader = lambda l:l.startswith('>')
    header = None
    for startgroup, dataiter in groupby(seq, isheader):
        if startgroup is True:
            header = list(dataiter)[-1]
        elif startgroup is False:
            yield header, ''.join(dataiter)

print list(name_seq_chunks(query))

这将生成一个元组列表,例如[('>header', 'caatgccttt...'), ...] 如果您确实希望将它们分开,则可以重新压缩列表:

names, seqs = zip(*name_seq_chunks(query))

暂无
暂无

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

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