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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top