我有一个这样的字符串:
'(459..521),(1834..2736)'
我希望看起来像这样:
[(459, 521), (1834, 2736)]
即,带有值而不是字符串的元组列表。
这是我到目前为止所提出的:
def parseAnnotation(annotation):
thing=[]
number=""
for c in annotation:
if c.isdigit()==True:
number=number+c
else:
thing.append(number)
number=""
thing.append(number)
thing = filter(None, thing)
return thing
输出:
['459', '521', '1834', '2736']
我有一种感觉,我已经走了一条比必要的更长的道路,所以很容易接受一种更简单的方法。请耐心等待,我对Python很新。感谢。
答案 0 :(得分:2)
def parseAnnotation(annotation):
return [tuple(pair[1:-1].split('..')) for pair in annotation.split(',')]
编辑:literal_eval
速度较慢(而且pythonic IMO较少):
In [4]: %timeit list(ast.literal_eval(strs.replace('..',',')))
100000 loops, best of 3: 17.8 us per loop
In [5]: %timeit [tuple(pair[1:-1].split('..')) for pair in strs.split(',')]
1000000 loops, best of 3: 1.22 us per loop
另一个编辑:忘了你需要ints
。
def parseAnnotation(annotation):
return [tuple(map(int, pair[1:-1].split('..'))) for pair in annotation.split(',')]
这有点难以理解,让我们把它写成一个循环:
def parseAnnotation(annotation):
result = []
for pair in annotation.split(','):
a, b = pair[1:-1].split('..')
result.append( (int(a), int(b)) )
return result
您决定是否需要处理无效输入。
答案 1 :(得分:1)
import ast
annotation = '(459..521),(1834..2736)'
def parseAnnotation(annotation):
return list(ast.literal_eval(annotation.replace('..', ',')))
# returns [(459, 521), (1834, 2736)]
答案 2 :(得分:0)
使用ast.literal_eval()
:
In [9]: import ast
In [11]: strs='(459..521),(1834..2736)'
In [12]: strs=strs.replace("..",",")
In [13]: lis=ast.literal_eval(strs)
In [14]: lis
Out[14]: ((459, 521), (1834, 2736))
In [16]: list(lis)
Out[16]: [(459, 521), (1834, 2736)]
答案 3 :(得分:0)
好的,我的回答非常简单(暂时不在我的简历中)
s = '(459..521),(1834..2736)'
result = []
for x in s.split(','):
x = x.strip('()')
x = x.split('..')
x = [int(i) for i in x]
result.append(tuple(x))
print result
总是尝试在字符串中获取模式并使用字符串方法稍微玩一下。