17

我有看起来像这样的字符串:

"(8, 12.25), (13, 15), (16.75, 18.5)"

我想将它们中的每一个都转换成python数据结构。最好是包含一对浮点值的元组列表(或元组)。

我可以这样做eval("(8, 12.25), (13, 15), (16.75, 18.5)")给我一个元组的元组,但我不认为天真地评估外部信息是一个明智的决定。

所以我想知道一个优雅的 pythonic 解决方案会是什么样子。

4

6 回答 6

26
>>> import ast
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)")
((8, 12.25), (13, 15), (16.75, 18.5))
于 2009-11-27T18:29:06.187 回答
4
def parse(s):
    tuples = s.split('), ')
    out = []
    for x in tuples:
        a,b = x.strip('()').split(', ')
        out.append((float(a),float(b)))
    return out

这应该可以完成这项工作。

于 2009-11-27T18:53:35.377 回答
2

我过去曾将safe_eval用于此类工作。

于 2009-11-27T19:03:19.457 回答
1

如果您正在使用 CSV 文件,并且您想要的不仅仅是不处理任何错误的“简单”解决方案,那么您最好使用Python 的 CSV 模块

于 2009-11-27T18:29:21.693 回答
1

下载PyParsing

我以前用过它。你可以从中获得一些非常强大的解析行为,我认为它提供了内置函数,可以处理你的整个解析需求。查找 commaSeparatedList 和 nestedExpr。

于 2009-11-27T18:35:39.017 回答
1

系统地做这件事有什么问题?拆分“)”,然后遍历列表,删除所有“(”。

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

现在您可以将每个元素带入您的数据结构中。

于 2009-11-27T23:21:31.663 回答