如何从字符串中创建元组列表?

时间:2014-01-05 10:06:32

标签: python string list tuples

  

写一个函数

     

def parseAnnotation(annotation):

     

以字符串annotation作为参数。该字符串以下列方式(start..end),(start..end)等描述序列中CDS的位置。字符串'(459..521),(1834..2736)'指定CDS分布在两个外显子中,其中一个部分从基数459到基数521(包括两者),其余部分从基数1834到基数2736(包括两者)。该函数必须返回一个列表,其中包含每个CDS部分的元组,每个部分都有一个起始值和结束值。

     

用法示例:   parseAnnotation('(459..521),(1834..2736)')   应该回来   [(459, 521), (1834, 2736)]

我的尝试:

def parseAnnotation(annotation):
lst = []
for seq in annotation:
    seq.replace("..", ",")
    lst = seq
    return annotation

print parseAnnotation('(459..521), (1834..2736)')

输出:

(459..521), (1834..2736)

我该怎么办?

3 个答案:

答案 0 :(得分:5)

字符串是不可变的,您应该将str.replace返回的字符串分配给变量。

>>> s = '(459..521), (1834..2736)'
>>> new_s = s.replace('..', ',')
>>> new_s
'(459,521), (1834,2736)'
>>> s                          #Still unchanged
'(459..521), (1834..2736)'

要获取元组列表,请使用ast.literal_evallist()

>>> from ast import literal_eval
>>> list(literal_eval(new_s))
[(459, 521), (1834, 2736)]

答案 1 :(得分:1)

def stripString(ann):
    return ann.strip().lstrip("(").rstrip(")").split("..")

def parseAnnotation(ann):
    return [tuple(map(int, stripString(j))) for j in ann.split(",")]

print parseAnnotation('(459..521),(1834..2736)')

<强>输出

[(459, 521), (1834, 2736)]

<强>解释

首先,使用parseAnnotation调用(459..521),(1834..2736)。它根据,拆分整个字符串。所以,我们会得到['(459..521)', '(1834..2736)']。然后它逐个元素地选择并执行以下操作。 (有关解释,我将(459..521)

使用stripString调用

(459..521)函数,其中应用了第一个strip(),删除了两侧的所有不必要的空白字符。然后,空格剥离的字符串经过lstrip("(")rstrip(")"),从字符串的左侧删除(,从字符串的右侧删除) 。因此,当前字符串变为'459..521'。现在它基于..进行拆分,因此我们将从['459', '521']函数中获取stripString。现在,函数调用结束了,表达式变成了这个

tuple(map(int, ['459', '521']))

由于数字实际上是字符串格式,我们将它们转换为具有int函数的数字。因此,我们将获得tuple([459, 521]),这将提供(459, 521)

答案 2 :(得分:0)

我的解决方案不像解决方案那样高效,但我只是一步一步地做到了,我得到了它。我只是发布它来展示,你怎么可以继续简化。

def parseAnnotation(ann):
    tmp = ann.replace('..', ',')  # remove .. from the tuple: '(123..123), (4321..8765)'
                                  #                          =>'(123, 123), (4321, 8765)'
    tmp = tmp.replace('(', '')    # remove ( from the string
    tmp = tmp.replace(')', '')    # remove ) from the string 
    tmp = tmp.replace(' ', '')    # remove spaces from the string to get something like that
                                  # '123,123,4321,8765'
    tmp = tmp.split(',')          # ['123', '123', '4321', '8765']
    return [(int(tmp[i]), int(tmp[i+1])) for i in range(len(tmp)-2)]

我只是修改了字符串,然后我把它放在一个元组中。 但不幸的是,它并不像那样的优雅和高效。