Меняя струну AF в список кортежей с ценностями

У меня есть последовательность как это:

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

У меня есть чувство AF, что я взял более длинную дорогу, чем необходимый, таким образом, исходные данные к более легкому подходу - много приветствия. Пожалуйста, терпите меня, я очень плохо знаком с Пайтоном. Спасибо.

3
nl ja de

4 ответы

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

Вы решаете, должно ли это иметь дело с недействительными исходными данными.

2
добавлено
Посмотрите, что мой редактировать, я забыл, что вы хотите числа.
добавлено автор Pavel Anossov, источник
Я все еще получаю последовательности, когда я пишу вашу функцию? Это то право?
добавлено автор Annnnnna, источник
Это длится, редактируют, действительно хорошо - соответствует моему уровню также. (начатое программирование 7 несколько недель назад)
добавлено автор Annnnnna, источник
import ast
annotation = '(459..521),(1834..2736)'

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

# returns [(459, 521), (1834, 2736)]
1
добавлено
AST - огромное излишество для этого. Также это бросит SyntaxError s с недействительными исходными данными, что-то вы wouldn' t хотят поймать.
добавлено автор Pavel Anossov, источник
Мне нравится эта версия, Спасибо!
добавлено автор Annnnnna, источник
Также я не знал функции перед этим комментарием, таким образом, я не мог бы использовать этого, так как это немного вне моего учебного плана. Но Спасибо!
добавлено автор Annnnnna, источник

использование 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)]
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

Всегда пытайтесь получить образец в последовательности и играть немного с методами последовательностей.

0
добавлено
Хотя, когда умные люди совет вы, чтобы использовать что-то это может быть по некоторым причинам, я пошел бы с ast, стою изучения и сделан для этого ситуациями.
добавлено автор Manuel Gutierrez, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community