Analizar una cadena que representa una lista de tuplas

Tengo cuerdas que se parecen a esta:

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

y me gustaría convertir cada uno de ellos en una estructura de datos de python. Preferiblemente una lista (o tupla) de tuplas que contienen un par de valores flotantes.

Podría hacer eso con eval("(8, 12.25), (13, 15), (16.75, 18.5)") que me da una tupla de tuplas, pero no creo que evaluar ingenuamente la información externa sea una decisión acertada .

Así que me pregunté cómo sería una elegante solución pythonica.

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

Esto debería hacer el trabajo.

He usado safe_eval para trabajos como este en el pasado.

Si está trabajando con un archivo CSV y desea algo más que la solución “ingenua” que no maneja ningún error, probablemente sea mejor que use el módulo CSV de Python .

Descargar PyParsing .

He trabajado con eso antes. Puede obtener un comportamiento de análisis bastante robusto, y creo que proporciona elementos integrados que manejarán todas sus necesidades de análisis con este tipo de cosas. Busque commaSeparatedList y nestedExpr.

¿Qué hay de malo en hacerlo sistemáticamente? dividir en “)”, luego pasar por la lista, eliminar todos “(“.

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

Ahora puedes incorporar cada elemento a tu estructura de datos.