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

18

我有一些像这个样子的字符串:

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

我希望将它们转换为Python数据结构,最好是包含一对浮点值的元组列表(或元组)。

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

因此,我想知道一个优雅的Pythonic解决方案可能是什么样子。

6个回答

27
>>> 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
jfyi,这可能不够健壮,因为列表中只有一个元组。如果您的输入是“(8, 12.25)”,那么您将只得到一个元组,而不是嵌套的元组。我认为,如果输入是“(8, 12.25),”(请注意逗号后跟一个空格),则会获得所需的嵌套元组。但是我没有测试过,因为我在这台机器上没有安装Python 2.6。 - Tom
Tom,你说得对。我还没有考虑到这个问题,实际上在我的情况下这将是一个问题。解析后我会检查一下。感谢你的提醒。不幸的是,在Python2.5中该方法不可用,但在我的情况下,这没关系,因为我正在使用它来编写应用引擎数据导入脚本,而不是在应用引擎本身中使用。 - tosh
+1:之前不知道ast.literal_eval,但它很方便啊! - Florian Brucker

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

我过去在类似的工作中使用了safe_eval


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

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


1

如果你正在使用CSV文件,并且想要更好的解决方案,而不是“天真”的解决方案,它不能处理任何错误,那么最好使用Python的CSV模块


抱歉,我给出的问题有点模糊。实际上,这个字符串是我在逗号/分号分隔的值中获取的一个值。我将从问题中移除CSV部分,因为可能会引起混淆。顺便说一下,我正在使用CSV模块,它非常好用。虽然谢谢你的回答。 - tosh

1

下载PyParsing

我以前用过它。你可以从中获得相当强大的解析行为,我认为它提供了内置函数来处理这种类型的所有解析需求。查找commaSeparatedList和nestedExpr。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接