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(",")]