如何继续追加到一个列表行,直到某个字符?

2024-09-26 22:54:03 发布

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

我正在尝试在“>;”字符附加到一个列表之前创建多行,以便将其转换为字典中的值。例如,我想:

> 1
AAA
CCC
> 2

成为AAACCC。你知道吗

代码如下:

def parse_fasta(path):
    with open(path) as thefile:
        label = []
        sequences = []
        for k, line in enumerate(thefile):
            if line.startswith('>'):
                labeler = line.strip('>').strip('\n')
                label.append(labeler)
            else:
                seqfix = ''.join(line.strip('\n'))
                sequences.append(seqfix)
    dict_version = {k: v for k, v in zip(label, sequences)}
    return dict_version
parse_fasta('small.fasta')

Tags: pathinforparseversionlinelabeldict
1条回答
网友
1楼 · 发布于 2024-09-26 22:54:03

你可以边做边编字典。这里有一个方法。你知道吗

编辑:删除了defaultdict(因此没有模块)

from pprint import pprint

dict_version = {}

with open('fasta_sample.txt', 'r') as f:
    for line in f:
        line = line.rstrip()

        if line.startswith('>'):
            key = line[1:]
        else:
            if key in dict_version:
                dict_version[key] += line
            else:
                dict_version[key] = line

pprint(dict_version)

示例文件:

>1FN3:A|PDBID|CHAIN|SEQUENCE
VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHGKKVADALTNAVAHVDDMPNAL
SALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR

>5OKT:A|PDBID|CHAIN|SEQUENCE
MGSSHHHHHHSSGLVPRGSHMELRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQ
GGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGK
KGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAAT
KRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK*

>2PAB:A|PDBID|CHAIN|SEQUENCE
GPTGTGESKCPLMVKVLDAVRGSPAINVAVHVFRKAADDTWEPFASGKTSESGELHGLTTEEQFVEGIYKVEIDTKSYWK
ALGISPFHEHAEVVFTANDSGPRRYTIAALLSPYSYSTTAVVTNPKE*

>3IDP:B|PDBID|CHAIN|SEQUENCE
HHHHHHDRNRMKTLGRRDSSDDWEIPDGQITVGQRIGSGSFGTVYKGKWHGDVAVKMLNVTAPTPQQLQAFKNEVGVLRK
TRHVNILLFMGYSTKPQLAIVTQWCEGSSLYHHLHIIETKFEMIKLIDIARQTAQGMDYLHAKSIIHRDLKSNNIFLHED
LTVKIGDFGLATEKSRWSGSHQFEQLSGSILWMAPEVIRMQDKNPYSFQSDVYAFGIVLYELMTGQLPYSNINNRDQIIF
MVGRGYLSPDLSKVRSNCPKAMKRLMAECLKKKRDERPLFPQILASIELLARSLPKIHRS

>4QUD:A|PDBID|CHAIN|SEQUENCE
MENTENSVDSKSIKNLEPKIIHGSESMDSGISLDNSYKMDYPEMGLCIIINNKNFHKSTGMTSRSGTDVDAANLRETFRN
LKYEVRNKNDLTREEIVELMRDVSKEDHSKRSSFVCVLLSHGEEGIIFGTNGPVDLKKIFNFFRGDRCRSLTGKPKLFII
QACRGTELDCGIETDSGVDDDMACHKIPVEADFLYAYSTAPGYYSWRNSKDGSWFIQSLCAMLKQYADKLEFMHILTRVN
RKVATEFESFSFDATFHAKKQIPCIVSMLTKELYFYH

这本词典的精美印刷品是:

{'1FN3:A|PDBID|CHAIN|SEQUENCE': 'VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHGKKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR',
 '2PAB:A|PDBID|CHAIN|SEQUENCE': 'GPTGTGESKCPLMVKVLDAVRGSPAINVAVHVFRKAADDTWEPFASGKTSESGELHGLTTEEQFVEGIYKVEIDTKSYWKALGISPFHEHAEVVFTANDSGPRRYTIAALLSPYSYSTTAVVTNPKE*',
 '3IDP:B|PDBID|CHAIN|SEQUENCE': 'HHHHHHDRNRMKTLGRRDSSDDWEIPDGQITVGQRIGSGSFGTVYKGKWHGDVAVKMLNVTAPTPQQLQAFKNEVGVLRKTRHVNILLFMGYSTKPQLAIVTQWCEGSSLYHHLHIIETKFEMIKLIDIARQTAQGMDYLHAKSIIHRDLKSNNIFLHEDLTVKIGDFGLATEKSRWSGSHQFEQLSGSILWMAPEVIRMQDKNPYSFQSDVYAFGIVLYELMTGQLPYSNINNRDQIIFMVGRGYLSPDLSKVRSNCPKAMKRLMAECLKKKRDERPLFPQILASIELLARSLPKIHRS',
 '4QUD:A|PDBID|CHAIN|SEQUENCE': 'MENTENSVDSKSIKNLEPKIIHGSESMDSGISLDNSYKMDYPEMGLCIIINNKNFHKSTGMTSRSGTDVDAANLRETFRNLKYEVRNKNDLTREEIVELMRDVSKEDHSKRSSFVCVLLSHGEEGIIFGTNGPVDLKKIFNFFRGDRCRSLTGKPKLFIIQACRGTELDCGIETDSGVDDDMACHKIPVEADFLYAYSTAPGYYSWRNSKDGSWFIQSLCAMLKQYADKLEFMHILTRVNRKVATEFESFSFDATFHAKKQIPCIVSMLTKELYFYH',
 '5OKT:A|PDBID|CHAIN|SEQUENCE': 'MGSSHHHHHHSSGLVPRGSHMELRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK*'}

编辑:尝试后使用解决方案:

from pprint import pprint

def parse_fasta(path):
    with open(path) as thefile:
        label = []
        sequences = ''
        total_seq = []

        for line in thefile:
            line = line.strip()
            if len(line) == 0:
                continue
            if line.startswith('>'):
                line = line.strip('>')
                label.append(line)
                if len(sequences) > 0:
                    total_seq.append(sequences)
                    sequences = ''
            else:
                sequences += line

        total_seq.append(sequences)

    dict_version = {k: v for k, v in zip(label, total_seq)}
    return dict_version

d = parse_fasta('fasta_sample.txt')

pprint(d)

您将看到我做了一些更改以获得正确的输出。我添加了一个数组total_seq来保存每个序列头的序列。(你没有这个,这是你的解决方案中的一个问题)。代码中的joins没有做任何事情。这个值只是一个字符串,尽管您的想法是正确的。您将在修订后的代码中看到join将一个头id的累积序列连接到一个fasta字符字符串中。你知道吗

我测试了空白行,如果行是空白的,我做了一个continue,(len(line) == 0)。你知道吗

有一个测试if len(sequences) > 0来看看是否有任何序列被发现。他们不会在第一张唱片上。它会在看到任何序列之前看到ID。你知道吗

for循环完成之后,有必要添加最后一个序列

total_seq.append(sequences)

因为当检测到新的ID时,除了最后一个序列之外的所有其他序列都被添加到总序列中。你知道吗

我希望这个解释是有帮助的,因为它更接近您的代码。你知道吗

相关问题 更多 >

    热门问题