2009-03-13 12 views
317

tengo una tupla de tuplas de una consulta MySQL como esto:Cómo convertir cadenas en enteros en Python?

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 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]] 

Traté de lograrlo con eval pero no obtuve ningún resultado decente todavía.

+2

consideran Tal vez un módulo adaptador de base de datos diferente?Sé que los módulos adaptadores PostgreSQL devolverán resultados como su conjunto T2. – kquinn

+3

Posible duplicado de [Parse String to Float or Int] (http://stackoverflow.com/questions/379906/parse-string-to-float-or-int) – Nathan

+0

tenga en cuenta: al utilizar el mapa, obtendrá una lista de objetos de mapa en python 3 y 3.5. Esto lo hace para Python 3.5 como se mencionó anteriormente. new_list = list (list (int (a) para a en b) para b en T1 if a.isdigit()) – Guest

Respuesta

476

int() es la función incorporada estándar de Python para convertir una cadena en un valor entero. Se le llama con una cadena que contiene un número como argumento y devuelve el número convertir en un entero real:

print int("1") + 1 

Las impresiones anteriores 2.

Si conoce la estructura de su lista, T1 (que simplemente contiene listas, primera planta), usted puede 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] 
+3

¡Genial! En realidad, el ejemplo dado también funciona para números "desnudos" en la entrada, pero los envolverá en listas de un elemento. – unwind

+1

@unwind Buena respuesta – aatifh

+1

no funciona en py3k – SilentGhost

26

Usted puede hacer esto con una lista por comprensión:

T2 = [[int(column) for column in row] for row in T1] 

La lista interno comprensión ([int(column) for column in row]) b Uilds list de int s de una secuencia de int -able objetos, como cadenas de decimales, en row. La lista de comprensión externa ([... for row in T1])) crea 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 se pueden convertir por int. Necesitará una función más inteligente si desea procesar filas que contienen 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] 
0

Si es sólo una tupla de tuplas, algo así como rows=[map(int, row) for row in rows] hará el truco. (Hay una lista por comprensión y una llamada para mapear (f, LST), que es igual a [f (a) para una de LST], en ese país.)

Eval es no lo que quiere hacer, en caso de que haya algo como __import__("os").unlink("importantsystemfile") en su base de datos por algún motivo. Siempre valide su entrada (si nada más, la excepción int() se levantará si tiene una entrada incorrecta).

4

Uso de listas por comprensión:

t2 = [map(int, list(l)) for l in t1] 
+0

en python 3 esto devuelve una lista de objetos de mapa :( – CpILL

10

Estoy de acuerdo con everyones respuestas hasta ahora, pero el problema es que si es que no tiene todos los enteros que se colgará.

Si quería excluir a 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 números reales. La razón por la que no uso listas directas de comprensión es porque la comprensión de la lista filtra sus variables internas.

+1

'isdigit' es complicado, pruébalo en' -1'. 'Int ()' es la forma de comprobar por 'try' /' except'. – totoro

14

yo preferiría prefieren usar sólo las listas de comprensión:

[[int(y) for y in x] for x in T1] 
9
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 
+6

Bienvenido En lugar de solo publicar un bloque de código, explique por qué este código resuelve el problema planteado. Sin una explicación, esto no es una respuesta – Artemix

+1

Mejor sería: –

10

En lugar de poner int(), poner float() que le permitirá usar decimales, junto con los números enteros.

+1

¿Puede explicarme más detalles sobre su respuesta? – Rico

6

Pruebe esto.

x = "1" 

x es una cadena porque tiene comillas alrededor, pero tiene un número.

x = int(x) 

Desde x tiene el número 1 en ella, puedo convertirlo en un número entero.

Para ver si una cadena es un número, puede hacerlo.

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) 

Debe imprimir en IDLE True porque x es un número.

y_test = is_number(y) 

print(y_test) 

Debe imprimir en IDLE False porque y no en un número.

+2

Su función is_number es incorrecta. '1' no es igual a 1. Esto no es Perl. :-P – Veky

+0

No reinvente la rueda, use 'x.isnumeric()'. – bfontaine

3

En Python 3.5.1 cosas como éstas trabajo:

c = input('Enter number:') 
print (int(float(c))) 
print (round(float(c))) 

y

Enter number: 4.7 
4 
5 

George.

-6
for str in T2 : 
    return num(str) 

tal vez eso; Trabajaré

+3

Por favor, pruebe su código antes de publicar –

2

Sin embargo, otra solución funcional para Python 2:

from functools import partial 

map(partial(map, int), T1) 

Python 3 será un poco desordenado sin embargo:

list(map(list, map(partial(map, int), T1))) 

podemos Arregle esto con un contenedor

def oldmap(f, iterable): 
    return list(map(f, iterable)) 

oldmap(partial(oldmap, int), T1) 
0

Ver esta función

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 puede comprobar

if val == None: # True if input value can not be converted 
    pass # Note: Don't use 'if not val:' 
Cuestiones relacionadas