我有一些像这个样子的字符串:
"(8, 12.25), (13, 15), (16.75, 18.5)"
我希望将它们转换为Python数据结构,最好是包含一对浮点值的元组列表(或元组)。
我可以使用eval("(8, 12.25), (13, 15), (16.75, 18.5)")
来做到这一点,它给出了一个元组的元组。但我不认为轻率地评估外部信息是明智的决定。
因此,我想知道一个优雅的Pythonic解决方案可能是什么样子。
我有一些像这个样子的字符串:
"(8, 12.25), (13, 15), (16.75, 18.5)"
我希望将它们转换为Python数据结构,最好是包含一对浮点值的元组列表(或元组)。
我可以使用eval("(8, 12.25), (13, 15), (16.75, 18.5)")
来做到这一点,它给出了一个元组的元组。但我不认为轻率地评估外部信息是明智的决定。
因此,我想知道一个优雅的Pythonic解决方案可能是什么样子。
>>> import ast
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)")
((8, 12.25), (13, 15), (16.75, 18.5))
def parse(s):
tuples = s.split('), ')
out = []
for x in tuples:
a,b = x.strip('()').split(', ')
out.append((float(a),float(b)))
return out
>>> s="(8, 12.25), (13, 15), (16.75, 18.5)"
>>> [ i.replace("(","") for i in s.split(")") ]
['8, 12.25', ', 13, 15', ', 16.75, 18.5', '']
>>> b = [ i.replace("(","") for i in s.split(")") ]
>>> for i in b:
... print i.strip(", ").replace(" ","").split(",")
...
['8', '12.25']
['13', '15']
['16.75', '18.5']
['']
现在你可以将每个元素放入你的数据结构中。
如果你正在使用CSV文件,并且想要更好的解决方案,而不是“天真”的解决方案,它不能处理任何错误,那么最好使用Python的CSV模块。
下载PyParsing。
我以前用过它。你可以从中获得相当强大的解析行为,我认为它提供了内置函数来处理这种类型的所有解析需求。查找commaSeparatedList和nestedExpr。
ast.literal_eval
,但它很方便啊! - Florian Brucker