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 cadena en enteros y volver a colocarlos en una lista de listas:
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
Traté de lograrlo eval
pero aún no obtuve ningún resultado decente.
Respuestas:
int()
es la función incorporada estándar de Python para convertir una cadena en un valor entero. Lo llama con una cadena que contiene un número como argumento, y devuelve el número convertido a un entero:Las impresiones de arriba
2
.Si conoce la estructura de su lista, T1 (que simplemente contiene listas, solo un nivel), puede hacer esto en Python 2:
En Python 3:
fuente
T2 = map(lambda lol: map(int, lol), T1)
? O mapean o enumeran las comprensiones, ambos son tontos;)Puede hacer esto con una lista de comprensión:
La comprensión de la lista interna (
[int(column) for column in row]
) construye unalist
deint
s a partir de una secuencia deint
objetos habilitables, como cadenas decimales, enrow
. La comprensión de la lista externa ([... for row in T1])
) crea una lista de los resultados de la comprensión de la lista interna aplicada a cada elemento enT1
.El fragmento de código fallará si alguna de las filas contiene objetos que no se pueden convertir
int
. Necesitará una función más inteligente si desea procesar filas que contengan cadenas no decimales.Si conoce la estructura de las filas, puede reemplazar la comprensión de la lista interna con una llamada a una función de la fila. P.ej.
fuente
Prefiero usar solo listas de comprensión:
fuente
En lugar de poner
int( )
, pon lofloat( )
que te permitirá usar decimales junto con enteros.fuente
Estoy de acuerdo con las respuestas de todos hasta ahora, pero el problema es que si no tienes todos los números enteros, se estrellarán.
Si desea excluir no enteros, entonces
Esto produce solo dígitos reales. La razón por la que no uso la comprensión directa de la lista es porque la comprensión de la lista pierde sus variables internas.
fuente
isdigit
es complicado, pruébalo-1
.int(<str>)
es la forma de verificar portry
/except
.fuente
Prueba esto.
x es una cadena porque tiene comillas alrededor, pero tiene un número.
Como x tiene el número 1, puedo convertirlo en un número entero.
Para ver si una cadena es un número, puede hacer esto.
Debe imprimir en IDLE True porque x es un número.
Debe imprimirse en IDLE False porque y no es un número.
fuente
x.isnumeric()
.Usando listas de comprensión:
fuente
En Python 3.5.1 cosas como estas funcionan:
y
Jorge.
fuente
Ver esta función
Entonces
También puedes consultar
fuente
eval
es malvado: deberías reemplazarlo porast.literal_eval
.Otra solución funcional más para Python 2:
Sin embargo, Python 3 será un poco desordenado:
podemos arreglar esto con una envoltura
fuente
Si es solo una tupla de tuplas, algo así
rows=[map(int, row) for row in rows]
hará el truco. (Hay una lista de comprensión y una llamada al mapa (f, lst), que es igual a [f (a) para a in lst], allí).Eval no es lo que quieres hacer, en caso de que haya algo parecido
__import__("os").unlink("importantsystemfile")
en tu base de datos por alguna razón. Siempre valide su entrada (si no tiene nada más, la excepción int () aumentará si tiene una entrada incorrecta).fuente
Puedes hacer algo como esto:
fuente
Quiero compartir una opción disponible que parece no mencionarse aquí todavía:
Generará una permutación aleatoria de la matriz x. No es exactamente lo que solicitó, pero es una solución potencial para preguntas similares.
fuente