Python从多行不同长度的行中求和

时间:2018-09-26 17:23:47

标签: python recursion

我想要一个遍历下面每个列表项的函数,如果 该项目不带有'>',我希望函数将 每行中的字符然后将它们加在一起'''' ''' 我的第一个问题是我不知道如何在字符串列表中使用startswith()类型的函数 我的第二个问题是我不知道如何汇总所有行 此功能需要在具有任意数量字符的行上工作。

示例列表

one_seq = ['>JM_001 hypo pr\n', 'MQGNQST\n', 'HLR\n']

我正在尝试将递归代码放在一起

def get_seq_length(seq):
    if line in seq line.startswith('>'):
        return sum(seq)
    else:
        length = get_seq_length(len(seq))
        return length

get_seq_length(one_seq)

5 个答案:

答案 0 :(得分:0)

不要认为此代码需要递归,请尝试以下操作:

sum([len(x) for x in one_seq if not x.startswith(">")])

对于每个不以“>”开头的元素,它将使用len函数计算字符数。然后将所有相关元素的长度相加,得出总数

答案 1 :(得分:0)

IDLE中的某些内容可以为您提供字符串的第一个字符:

>>> s = "asdf"
>>> s[0]
'a'

您可以访问字符串中的字符,例如数组的元素。如果您尝试超出范围访问某些内容,则会收到错误消息。

因此,如果您知道字符串中至少包含一个元素,

for item in your_list:
    if item[0] == '>':
        #Do Something

如果您需要不带>前缀的字符串的总长度,

count = 0
for item in your_list:
    if item[0] != '>':
        count = count + len(item)

答案 2 :(得分:0)

此函数返回所有不以>开头的条目的长度。它不需要递归,只需遍历列表即可。

def get_seq_length(seq):
    count = 0
    for line in seq:
        if !line.startswith('>'):
            count += len(line)
    return count

get_seq_length(one_seq)

答案 3 :(得分:0)

IIUC您想计算行列表(cos)中每个元素(或行)中的字符数。要计算给定行中的字符数,可以使用one_seq,然后利用列表推导和len()将每一行的字符数相加。在您的OP中,听起来好像您只想这样做,如果列表中的至少1 行不是以sum()开头,您可以使用> 。应该这样做:

any()

测试一些示例:

sum([len(line) for line in one_seq if any(not l.startswith('>') for l in one_seq)])

收益:

one_seq = ['>JM_001 hypo pr\n', 'MQGNQST\n', 'HLR\n']
one_seq = ['>JM_001 hypo pr\n', '>MQGNQST\n', '>HLR\n']
one_seq = ['>JM_93rnfo pr\n', '>MQGT\n', 'HKHASDKN\n']

答案 4 :(得分:0)

我希望您可能会发现拥有序列ID和序列长度会很有用。这将使用列表理解,该列表理解与先前的答案相同,但也摆脱了换行符(\n)。

one_seq = ['>JM_001 hypo pr\n', 'MQGNQST\n', 'HLR\n']
seq_id,seq_len = process_seq(one_seq)

def process_seq(seq_lines):

    # using first line, remove >, remove \n and split at spaces taking the first part
    seq_id = seq_lines[0].replace('>','').rstrip().split(" ")[0]

    # get the sequence length:
    seq_len = sum(len(line.rstrip()) for line in seq_lines if not line.startswith('>'))

    return (seq_id,seq_len)