2009-03-13 17 views
317

Ich habe ein Tupel von Tupeln aus einer MySQL-Abfrage wie folgt:Wie konvertiert man Zeichenketten in Integer in Python?

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

Ich möchte alle Textelemente in ganze Zahlen umwandeln und sie in eine Liste von Listen setzen:

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

Ich habe versucht, es mit eval zu erreichen, aber noch kein anständiges Ergebnis erhalten.

+2

Vielleicht sollten Sie einen anderen Datenbankadapter-Modul überprüfen?Ich weiß, dass die PostgreSQL-Adaptermodule Ergebnisse wie Ihr T2-Set zurückgeben werden. – kquinn

+3

Mögliches Duplikat von [Parse String to Float oder Int] (http://stackoverflow.com/questions/379906/parse-string-to-float-or-int) – Nathan

+0

Bitte beachten Sie: Wenn Sie eine Karte verwenden, erhalten Sie eine Liste von Kartenobjekten in Python 3 und 3.5. Dies geschieht für Python 3.5 wie oben erwähnt. new_list = Liste (Liste (int (a) für a in b) für b in T1 wenn a.isdigit()) – Guest

Antwort

476

int() ist die integrierte Python-Standardfunktion zum Konvertieren einer Zeichenfolge in einen ganzzahligen Wert. Sie rufen es mit einer Zeichenfolge, die eine Zahl als Argument enthält, und es gibt die auf eine tatsächliche Ganzzahl umgewandelt Nummer:

print int("1") + 1 

Die obigen Drucke 2.

Wenn Sie die Struktur Ihrer Liste wissen, T1 (dh es enthält einfach Listen, nur eine Ebene), können Sie dies in Python tun 2:

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

In Python 3:

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

Großartig! Tatsächlich funktioniert das angegebene Beispiel auch für "nackte" Zahlen in der Eingabe, umschließt sie jedoch in Ein-Element-Listen. – unwind

+1

@unwind Schöne Antwort – aatifh

+1

funktioniert nicht in py3k – SilentGhost

26

Sie können dies tun mit einer Liste Verständnis:

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

Die innere Liste Verständnis ([int(column) for column in row]) b Erstellt eine list von int s aus einer Folge von int -fähigen Objekten, wie Dezimalzeichenfolgen, in row. Das äußere Listenverständnis ([... for row in T1])) erstellt eine Liste der Ergebnisse des inneren Listenverständnisses, das auf jedes Element in T1 angewendet wird. Das Codefragment schlägt fehl, wenn eine der Zeilen Objekte enthält, die nicht von int konvertiert werden können. Sie benötigen eine intelligentere Funktion, wenn Sie Zeilen mit nicht-dezimalen Zeichenfolgen verarbeiten möchten.

Wenn Sie die Struktur der Zeilen kennen, können Sie das Verständnis der inneren Liste durch einen Aufruf einer Funktion der Zeile ersetzen. Z.B.

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

Wenn es nur ein Tupel von Tupeln ist, so etwas wie rows=[map(int, row) for row in rows] den Trick. (Es gibt eine Liste Verständnis und ein Aufruf zur Karte (f, lst), die [f (a) für ein in lst] gleich ist, da drin.)

Eval ist nicht, was Sie tun wollen, falls es aus irgendeinem Grund etwas wie __import__("os").unlink("importantsystemfile") in Ihrer Datenbank gibt. Überprüfen Sie immer Ihre Eingabe (wenn nichts anderes vorhanden ist, wird die Ausnahme int() ausgelöst, wenn Sie eine schlechte Eingabe haben).

4

Mit Listenkomprehensionen:

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

In Python 3 gibt dies eine Liste von Kartenobjekten zurück :( – CpILL

10

ich mit everyones Antworten so weit zustimmen würde, aber das Problem ist, dass, wenn Sie sie nicht abstürzen alle ganzen Zahlen haben.

Wenn Sie nicht ganze Zahlen dann

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

Dies ergibt nur die tatsächlichen Zahlen ausschließen wollte. Der Grund, warum ich keine direkte Listenkomprehension verwende, liegt darin, dass das Listenverständnis ihre internen Variablen verliert.

+1

'isdigit' ist knifflig, probiere es auf' -1'. 'Int ()' ist der Weg zu überprüfen mit 'try' /' except'. – totoro

14

Ich würde lieber nur Verständnis Listen mit bevorzugen:

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

Willkommen zu stapeln Überlauf! Anstatt nur einen Block von Code, bitte erklären, warum dieser Code löst das Problem gestellt. Ohne eine Erklärung, dies ist nicht eine Antwort. – Artemix

+1

Besser wäre: –

10

Statt int() des Setzens, setzen float(), die Sie Dezimalzahlen zusammen mit ganzen Zahlen verwenden lassen.

+1

Können Sie mehr Details zu Ihnen beantworten erklären? – Rico

6

Versuchen Sie es.

x = "1" 

x ist eine Zeichenkette, weil sie in Anführungszeichen steht, aber sie hat eine Zahl.

Da x die Nummer 1 hat, kann ich es in eine Ganzzahl umwandeln.

Um zu sehen, ob eine Zeichenfolge eine Zahl ist, können Sie dies tun.

Es sollte auf IDLE True drucken, da x eine Zahl ist.

y_test = is_number(y) 

print(y_test) 

Es sollte auf IDLE False gedruckt werden, weil y in keine Nummer.

+2

Ihre is_number Funktion ist falsch. '1' ist nicht gleich 1. Dies ist nicht Perl. :-P – Veky

+0

Erfinden Sie das Rad nicht neu, verwenden Sie 'x.isnumeric()'. – bfontaine

3

In Python 3.5.1 Dinge wie diese Arbeit:

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

und

Enter number: 4.7 
4 
5 

George. ;

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

vielleicht, dass ll

+3

Bitte testen Sie Ihren Code vor dem Posten –

2

Noch eine weitere funktionelle Lösung für Python 2 arbeiten:

from functools import partial 

map(partial(map, int), T1) 

Python 3 wird allerdings ein wenig chaotisch:

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

können wir behebe dies mit einem Wrapper

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

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

Sehen Sie diese Funktion

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

Dann

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 

Sie auch

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