2009-03-13 49 views
317

Ho un tupla di tuple da una query MySQL come questo:Come convertire stringhe in numeri interi in Python?

T1 = (('13', '17', '18', '21', '32'), 
     ('07', '11', '13', '14', '28'), 
     ('01', '05', '06', '08', '15', '16')) 

mi piacerebbe convertire tutti gli elementi stringa in numeri interi e riporli in una lista di liste:

T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]] 

Ho provato a raggiungerlo con eval ma non ho ancora ottenuto alcun risultato decente.

+2

forse prendere in considerazione un diverso modulo adattatore database?So che i moduli dell'adattatore PostgreSQL restituiranno risultati come il tuo set T2. – kquinn

+3

Possibile duplicato di [Parse String to Float o Int] (http://stackoverflow.com/questions/379906/parse-string-to-float-or-int) – Nathan

+0

Si prega di notare: quando si utilizza la mappa, si otterrà una lista di oggetti mappa in python 3 e 3.5. Questo lo fa per Python 3.5 come menzionato sopra. new_list = list (list (int (a) per a in b) per b in T1 if a.isdigit()) – Guest

risposta

476

int() è la funzione incorporata standard di Python per convertire una stringa in un valore intero. Voi lo chiamate con una stringa contenente un numero come argomento, e restituisce il numero convertito in un intero reale:

print int("1") + 1 

Le stampe sopra 2.

Se si conosce la struttura della vostra lista, T1 (che contiene semplici elenchi, un solo livello), si potrebbe fare questo in Python 2:

T2 = [map(int, x) for x in T1] 

In Python 3:

T2 = [list(map(int, x)) for x in T1] 
+3

Great! In realtà, l'esempio fornito funziona anche per i numeri "nudi" nell'input, ma li avvolgerà in elenchi di elementi. – unwind

+1

@unwind La bella risposta – aatifh

+1

non funziona in py3k – SilentGhost

26

È possibile farlo con una lista di comprensione:

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

La lista interna di comprensione ([int(column) for column in row]) b utilizza uno list di int s da una sequenza di int oggetti utilizzabili, come le stringhe decimali, in row. La comprensione dell'elenco esterno ([... for row in T1])) crea un elenco dei risultati della comprensione dell'elenco interno applicata a ciascun elemento in T1.

Lo snippet di codice avrà esito negativo se una delle righe contiene oggetti che non possono essere convertiti da int. Avrai bisogno di una funzione più intelligente se desideri elaborare righe contenenti stringhe non decimali.

Se si conosce la struttura delle righe, è possibile sostituire la comprensione dell'elenco interno con una chiamata a una funzione della riga. Per esempio.

T2 = [parse_a_row_of_T1(row) for row in T1] 
0

Se è solo una tupla di tuple, qualcosa come rows=[map(int, row) for row in rows] farà il trucco. (C'è una lista di comprensione e una chiamata per mappare (f, LST), che è uguale a [f (a) per un a LST], lì dentro.)

Eval non è ciò che si vuole fare, nel caso ci sia qualcosa come __import__("os").unlink("importantsystemfile") nel database per qualche motivo. Convalida sempre il tuo input (se non altro, l'eccezione int() si alza se hai un input errato).

4

Uso list comprehension:

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

in python 3 questo restituisce una lista di oggetti della mappa :( – CpILL

10

Sono d'accordo con tutti quanti risposte finora ma il problema è che se non si dispone di tutti gli interi che andrà in crash.

Se si voleva escludere i non interi poi

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()) 

questo produce solo cifre attuali. La ragione per cui non uso le list comprehensions dirette è perché la comprensione delle liste perde le loro variabili interne.

+1

'isdigit' è difficile, prova su' -1'. 'Int ()' è il modo di verificare con 'try' /' except'. – totoro

14

vorrei piuttosto preferisce usare soltanto liste di comprensione:

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

Benvenuto Stack Overflow! Piuttosto che pubblicare solo un blocco di codice, spiegare perché questo codice risolve il problema posto senza una spiegazione, questo non è una risposta – Artemix

+1

Meglio sarebbe: –

10

Invece di mettere int(), mettere float() che vi permetterà di utilizzare i decimali con numeri interi.

+1

Puoi spiegare più dettagli sulla tua risposta? – Rico

6

Prova questo.

x = "1" 

x è una stringa, perché ha le virgolette intorno ad esso, ma ha un numero in esso.

x = int(x) 

Poiché x ha il numero 1 in esso, è possibile trasformarlo in un numero intero.

Per vedere se una stringa è un numero, è possibile farlo.

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) 

Si deve stampare su IDLE Vero perché x è un numero.

y_test = is_number(y) 

print(y_test) 

Si deve stampare su IDLE Falso perché y non è un numero.

+2

La tua funzione is_number è sbagliata. '1' non è uguale a 1. Questo non è Perl. :-P – Veky

+0

Non reinventare la ruota, usa 'x.isnumeric()'. – bfontaine

3

In Python 3.5.1 cose come questi lavori:

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

e

Enter number: 4.7 
4 
5 

George.

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

forse che; lavoreremo

+3

Verifica il tuo codice prima di postare –

2

Ancora un'altra soluzione funzionale per Python 2:

from functools import partial 

map(partial(map, int), T1) 

Python 3 sarà un po 'disordinato però:

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

possiamo sistemalo con un wrapper

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

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

Vedere questa funzione

def parse_int(s): 
    try: 
     res = int(eval(str(s))) 
     if type(res) == int: 
      return res 
    except: 
     return 

Poi

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 

È inoltre possibile controllare

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