3

次のような文字列があります。

'(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

4 に答える 4

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

無効な入力を処理する必要があるかどうかを決定します。

于 2012-12-28T13:05:08.060 に答える
1
import ast
annotation = '(459..521),(1834..2736)'

def parseAnnotation(annotation):
    return list(ast.literal_eval(annotation.replace('..', ',')))

# returns [(459, 521), (1834, 2736)]
于 2012-12-28T13:04:35.870 に答える
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)]
于 2012-12-28T13:05:03.543 に答える
0

わかりました、ここで私は ast のない答えに行きます (ast は今のところ私の履歴書にはありません)

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

常に文字列のパターンを取得して、文字列メソッドを少し試してみてください。

于 2012-12-28T15:29:51.947 に答える