Analizar una cadena que representa una lista de tuplas
-
05-07-2019 - |
Pregunta
Tengo cadenas 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 No piense que evaluar ingenuamente la información externa sería una decisión acertada.
Así que me pregunté cómo sería una elegante solución pitónica.
Solución
>>> import ast
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)")
((8, 12.25), (13, 15), (16.75, 18.5))
Otros consejos
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 más que " naive " Solución que no maneja ningún error. Probablemente sea mejor usar el módulo CSV de Python .
Descargue 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? dividido en ") " ;, luego recorra la lista, elimine 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 puede incorporar cada elemento a su estructura de datos.