Python强制转换元组[int,int]

时间:2019-04-19 04:30:51

标签: python parsing tuples

我有一个字符串"1,2",我试图将其解析为(1, 2),而不是简单地基于,进行拆分。我凭直觉思考着以下方面的事情:

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

这显然是行不通的,但是将特定的元组类型(int,int)转换为字符串进行解析似乎是合乎逻辑的。有想法吗?

3 个答案:

答案 0 :(得分:2)

typing模块用于另一种完全不同的东西(类型提示)。据我所知,没有内置任何东西可以做这种事情。您需要手动解析或eval

手动解析非常容易,只需在,上拆分并将每个元素转换为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)

答案 1 :(得分:0)

关于Tomothy32提到的基于逗号分割的手动解析是正确的。 您也可以将地图用于上方-

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

答案 2 :(得分:0)

对于像"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)