写一个函数
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)
我该怎么办?
答案 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_eval
和list()
:
>>> 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)]
我只是修改了字符串,然后我把它放在一个元组中。 但不幸的是,它并不像那样的优雅和高效。