Convertir la cadena de Python a la lista

Tengo una lista formateada como se muestra aquí:

>>> x = "[26, 25]" >>> list(x) ['[', '2', '6', ',', ' ', '2', '5', ']'] 

¿Cómo me convierto a una lista con elementos como se muestra aquí:

 >>> x [25, 26] 

Utilice ast.literal_eval() :

 import ast ast.literal_eval(x) 

o trátelo como JSON, usando json.loads() :

 import json json.loads(x) 

ast.literal_eval() toma los literales de Python como entrada (de modo que el texto que en el código fuente de Python le daría un valor), json.loads() toma la entrada de JSON.

Manifestación:

 >>> import ast, json >>> x = "[26, 25]" >>> ast.literal_eval(x) [26, 25] >>> json.loads(x) [26, 25] 

La diferencia entre los dos solo entra en juego cuando tiene más de una lista de enteros en su cadena de entrada; Las cadenas JSON contienen Unicode, que ast.literal_eval() en Python 2 no interpretaría correctamente, y los tipos JSON son solo un subconjunto de lo que ast.literal_eval() admite.

 >>> x = '["List", "with", "strings", "including", "snowman", "\u2603"]' >>> ast.literal_eval(x) ['List', 'with', 'strings', 'including', 'snowman', '\\u2603'] >>> json.loads(x) [u'List', u'with', u'strings', u'including', u'snowman', u'\u2603'] >>> x = "(1, 2, 3, 'a tuple is Python syntax, not JSON')" >>> ast.literal_eval(x) (1, 2, 3, 'a tuple is Python syntax, not JSON') >>> json.loads(x) Traceback (most recent call last): File "", line 1, in  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/__init__.py", line 338, in loads return _default_decoder.decode(s) File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/decoder.py", line 365, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/decoder.py", line 383, in raw_decode raise ValueError("No JSON object could be decoded") ValueError: No JSON object could be decoded 

Otra opción si sabes que estás haciendo lo correcto.

 x = "[26, 25]" y = eval(x) print y 

Mejor que “eval” (desde el punto de vista de seguridad y velocidad (probablemente)) sería:

 [int(v) for v in x[1:-1].replace(" ", "").split(",")]