Tengo una tupla de tuplas de una consulta MySQL como esta:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
Me gustaría convertir todos los elementos de la cadena en enteros y ponerlos de nuevo en una lista de listas:
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
He intentado conseguirlo con eval
pero no he conseguido ningún resultado decente.
int()
es la función estándar de Python para convertir una cadena en un valor entero. Se llama con una cadena que contiene un número como argumento, y devuelve el número convertido a un entero:
print (int("1") + 1)
Lo anterior imprime 2
.
Si conoces la estructura de tu lista, T1 (que simplemente contiene listas, de un solo nivel), podrías hacer esto en Python 2:
T2 = [map(int, x) for x in T1]
En Python 3
T2 = [list(map(int, x)) for x in T1]
Esto se puede hacer con la comprensión de una lista:
T2 = [[int(column) for column in row] for row in T1]
La comprensión de la lista interna ([int(columna) para la columna en la fila]
) construye una lista
de int
s de una secuencia de objetos int
-permitidos, como cadenas decimales, en fila
. La comprensión de la lista externa ([... for row in T1])
) construye una lista con los resultados de la comprensión de la lista interna aplicada a cada elemento de T1
.
El fragmento de código fallará si alguna de las filas contiene objetos que no pueden ser convertidos por int
. Necesitará una función más inteligente si quiere procesar filas que contengan cadenas no decimales.
Si conoce la estructura de las filas, puede sustituir la comprensión de la lista interna por una llamada a una función de la fila. Ej.
T2 = [parse_a_row_of_T1(row) for row in T1]
Si es sólo una tupla de tuplas, algo como rows=[map(int, row) for row in rows]
servirá. (Hay una comprensión de la lista y una llamada a map(f, lst), que es igual a [f(a) for a in lst], ahí dentro).
Eval es no lo que quiere hacer, en caso de que haya algo como __import__("os").unlink("importantsystemfile")
en su base de datos por alguna razón.
Valide siempre su entrada (si no hay nada más, la excepción int() se lanzará si tiene una entrada incorrecta).