Convertir una representación de cadena de una lista en un objeto de lista real [duplicado]

Resuelto Markum asked hace 12 años • 3 respuestas

Tengo una cadena que parece idéntica a una lista, digamos:

fruits = "['apple', 'orange', 'banana']"

¿Cuál sería la forma de convertir eso en un objeto de lista?

Markum avatar May 28 '12 00:05 Markum
Aceptado
>>> fruits = "['apple', 'orange', 'banana']"
>>> import ast
>>> fruits = ast.literal_eval(fruits)
>>> fruits
['apple', 'orange', 'banana']
>>> fruits[1]
'orange'

Como se señala en los comentarios, ast.literal_eval es seguro . De los documentos:

Evalúe de forma segura un nodo de expresión o una cadena que contenga una expresión de Python. La cadena o nodo proporcionado solo puede consistir en las siguientes estructuras literales de Python: cadenas, números, tuplas, listas, dicts, booleanos y Ninguno.

Esto se puede utilizar para evaluar de forma segura cadenas que contienen expresiones de Python de fuentes que no son de confianza sin la necesidad de analizar los valores uno mismo.

fraxel avatar May 27 '2012 17:05 fraxel

Una simple llamada a eval()hará:

fruits = eval("['apple', 'orange', 'banana']")
fruits
> ['apple', 'orange', 'banana']

O, como se explica en este artículo , lo mismo se puede lograr de forma un poco más segura (es decir, sin correr el riesgo de efectos secundarios no deseados o inyecciones de código malicioso) de esta manera:

fruits = eval("['apple', 'orange', 'banana']", {'__builtins__':None}, {})

Esta solución tiene la ventaja de no depender de módulos adicionales.

Óscar López avatar May 27 '2012 17:05 Óscar López