开发者

Parsing a string which represents a list of tuples [duplicate]

This question already has answers here: How to convert string representation of list to a list (19 answers) Closed 2 months ago.

I have strings which look like this one:

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

and I would like to convert each of them into a python data structure. Preferably a list (or tuple) of tuples containing a pair of float values.

I could do that with eval("(8, 12.25), (13, 15), (16.75, 18.5)") which gives me a t开发者_StackOverflow社区uple of tuples, but I don't think naively evaluating external information would be a wise decision.

So I wondered what an elegant pythonic solution might look like.


>>> 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

this should do the job.


I've used safe_eval for jobs like this in the past.


If you're working with a CSV file, and you want more than the "naive" solution which doesn't handle any errors, you're probably best off using the Python's CSV module.


Download PyParsing.

I've worked with it before. You can get some pretty robust parsing behavior out of it, and I think it provides builtins that will handle your entire parsing needs with this sort of thing. Look up commaSeparatedList and nestedExpr.


what's wrong with doing it systematically ? split on ")", then go through the list, remove all "(".

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

Now you can bring each element into your data structure.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜