我有一个字符串"1,2"
,我试图将其解析为(1, 2)
,而不是简单地基于,
进行拆分。我凭直觉思考着以下方面的事情:
from typing import Tuple
t = Tuple[int, int]("1,2")
这显然是行不通的,但是将特定的元组类型(int,int)转换为字符串进行解析似乎是合乎逻辑的。有想法吗?
答案 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)