解析表示元组列表的字符串

时间:2009-11-27 18:25:46

标签: python data-structures string eval tuples

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

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

我希望将它们中的每一个转换为python数据结构。优选地,包含一对浮点值的元组的列表(或元组)。

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

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

6 个答案:

答案 0 :(得分:22)

>>> import ast
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)")
((8, 12.25), (13, 15), (16.75, 18.5))

答案 1 :(得分: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

这应该可以胜任。

答案 2 :(得分:2)

我过去曾使用safe_eval这样的工作。

答案 3 :(得分:1)

如果您正在使用CSV文件,并且您想要的不仅仅是“天真”的解决方案,而且不能处理任何错误,那么您最好使用Python's CSV module

答案 4 :(得分:1)

下载PyParsing

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

答案 5 :(得分: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']
['']

现在您可以将每个元素添加到数据结构中。