问题
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 tuple 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.
回答1:
>>> import ast
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)")
((8, 12.25), (13, 15), (16.75, 18.5))
回答2:
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.
回答3:
I've used safe_eval for jobs like this in the past.
回答4:
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.
回答5:
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.
回答6:
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.
来源:https://stackoverflow.com/questions/1810109/parsing-a-string-which-represents-a-list-of-tuples