Кастинг Python Tuple [int, int] - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть строка "1,2", которую я пытаюсь проанализировать в (1, 2) без простого разбиения на основе ,. Я интуитивно думал о чем-то вроде:

from typing import Tuple
t = Tuple[int, int]("1,2")

Это явно не работает, но кажется логичным привести конкретный тип кортежа (int, int) к строке для анализа. Мысли?

Ответы [ 3 ]

2 голосов
/ 19 апреля 2019

Модуль typing предназначен для совершенно другой вещи (подсказка типа). Насколько я знаю, ничего подобного не существует. Вам нужно разобрать вручную или eval it.

Разбор вручную достаточно прост, просто разделите на , и преобразуйте каждый элемент в int:

your_string = "1,2"
tuple(int(i) for i in your_string.split(","))

eval это позволяет использовать другие типы данных, но является более "автоматическим" (используйте ast.literal_eval по соображениям безопасности):

import ast

your_string = "1,2"
ast.literal_eval(your_string)
0 голосов
/ 20 апреля 2019

Для простого ввода, такого как "1,2", наиболее простым решением является разбиение на ",".

Если ввод более сложный - возможно, он содержит пробелы или существует много возможных разделителей - вы можете написатьгенератор, который выдает целые числа:

>>> data = '18 ,15 ,18,15x,19,14,20,12,13,17'
>>> def interator(data):
...     digits = []
...     for c in data:
...         if c.isdigit():
...             digits.append(c)
...         else:
...             if digits:
...                 yield int(''.join(digits))
...                 del digits[:]
...     if digits:
...         yield int(''.join(digits))
... 
>>> tuple(interator(data))
(18, 15, 18, 15, 19, 14, 20, 12, 13, 17)

Как это часто бывает, есть однострочная строка itertools, которая делает то же самое:

>>> tuple(int(''.join(s)) for _, s in 
...       filter(lambda x: x[0], itertools.groupby(data, str.isdigit)))
(18, 15, 18, 15, 19, 14, 20, 12, 13, 17)

Но регулярное выражение будет кратким и для чтения:

>>> tuple(int(x.group(0)) for x in re.finditer(r'\d+', data))
(18, 15, 18, 15, 19, 14, 20, 12, 13, 17)
0 голосов
/ 19 апреля 2019

То, что Tomothy32 упомянул о ручном разборе, основанном на разделении запятой, является правильным.Вы также можете использовать карту для выше, как показано ниже -

your_input = "1,2"
your_tuple = tuple(map(int, your_input.split(',')))
...