tipos - string en python
¿Cómo convertir cadenas en números enteros en Python? (13)
En Python 3.5.1 cosas como estas funcionan:
c = input(''Enter number:'')
print (int(float(c)))
print (round(float(c)))
y
Enter number: 4.7
4
5
Jorge.
Tengo una tupla de tuplas de una consulta de 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 números enteros y volver a ponerlos en una lista de listas:
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
Intenté lograrlo con eval
pero aún no obtuve ningún resultado decente.
En lugar de poner int( )
, ponga float( )
que le permitirá usar decimales junto con enteros.
Estoy de acuerdo con las respuestas de todos, pero el problema es que si no tienes todos los números enteros, se bloquearán.
Si quisieras excluir los no enteros entonces
T1 = ((''13'', ''17'', ''18'', ''21'', ''32''),
(''07'', ''11'', ''13'', ''14'', ''28''),
(''01'', ''05'', ''06'', ''08'', ''15'', ''16''))
new_list = list(list(int(a) for a in b) for b in T1 if a.isdigit())
Esto produce sólo dígitos reales. La razón por la que no uso la comprensión directa de listas es porque la comprensión de lista filtra sus variables internas.
Otra solución funcional para Python 2:
from functools import partial
map(partial(map, int), T1)
Python 3 será un poco desordenado aunque:
list(map(list, map(partial(map, int), T1)))
Podemos arreglar esto con una envoltura
def oldmap(f, iterable):
return list(map(f, iterable))
oldmap(partial(oldmap, int), T1)
Preferiría usar solo listas de comprensión:
[[int(y) for y in x] for x in T1]
Prueba esto.
x = "1"
x es una cadena porque tiene comillas a su alrededor, pero tiene un número.
x = int(x)
Como x tiene el número 1 en él, puedo convertirlo en un entero.
Para ver si una cadena es un número, puedes hacer esto.
def is_number(var):
try:
if var == int(var):
return True
except Exception:
return False
x = "1"
y = "test"
x_test = is_number(x)
print(x_test)
Se debe imprimir en IDLE Verdadero porque x es un número.
y_test = is_number(y)
print(y_test)
Debería imprimirse en IDLE Falso porque y no es un número.
Puedes hacer algo como esto:
T1 = ((''13'', ''17'', ''18'', ''21'', ''32''),
(''07'', ''11'', ''13'', ''14'', ''28''),
(''01'', ''05'', ''06'', ''08'', ''15'', ''16''))
new_list = list(list(int(a) for a in b if a.isdigit()) for b in T1)
print(new_list)
Puedes hacer esto con una lista de comprensión:
T2 = [[int(column) for column in row] for row in T1]
La lista de comprensión interna ( [int(column) for column in row]
) construye una list
de int
s a partir de una secuencia de objetos int
-able, como cadenas decimales, en row
. La comprensión de la lista externa ( [... for row in T1])
construye una lista de los resultados de la comprensión de la lista interna aplicada a cada elemento en T1
.
El fragmento de código fallará si alguna de las filas contiene objetos que no pueden convertirse mediante 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.
T2 = [parse_a_row_of_T1(row) for row in T1]
Si solo es una tupla de tuplas, algo así como rows=[map(int, row) for row in rows]
hará el truco. (Hay una lista de comprensión y una llamada a mapear (f, lst), que es igual a [f (a) para a in lst], allí).
Eval no es lo que quiere hacer, en caso de que haya algo como __import__("os").unlink("importantsystemfile")
en su base de datos por algún motivo. Valide siempre su entrada (si no tiene otra cosa, la excepción int () se incrementará si tiene una entrada incorrecta).
Utilizando listas de comprensión:
t2 = [map(int, list(l)) for l in t1]
Ver esta funcion
def parse_int(s):
try:
res = int(eval(str(s)))
if type(res) == int:
return res
except:
return
Entonces
val = parse_int(''10'') # Return 10
val = parse_int(''0'') # Return 0
val = parse_int(''10.5'') # Return 10
val = parse_int(''0.0'') # Return 0
val = parse_int(''Ten'') # Return None
También puedes consultar
if val == None: # True if input value can not be converted
pass # Note: Don''t use ''if not val:''
int()
es la función incorporada estándar de Python para convertir una cadena en un valor entero. Lo llamas con una cadena que contiene un número como argumento y devuelve el número convertido a un entero:
print (int("1") + 1)
Las impresiones de arriba 2
.
Si conoces la estructura de tu lista, T1 (que simplemente contiene listas, solo un nivel), puedes 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]
T3=[]
for i in range(0,len(T1)):
T3.append([])
for j in range(0,len(T1[i])):
b=int(T1[i][j])
T3[i].append(b)
print T3