将af字符串更改为具有值的元组列表

时间:2012-12-28 12:55:32

标签: python string tuples

我有一个这样的字符串:

'(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很新。感谢。

4 个答案:

答案 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

总是尝试在字符串中获取模式并使用字符串方法稍微玩一下。