Ich habe ein Tuple Tupel aus einer MySQL-Abfrage wie folgt:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
Ich möchte alle Zeichenfolgenelemente in Ganzzahlen konvertieren und sie wieder in eine Liste mit Listen aufnehmen:
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, bekam aber noch kein anständiges Ergebnis.
int()
ist die in Python eingebaute Standardfunktion zum Konvertieren einer Zeichenfolge in einen Ganzzahlwert. Sie rufen es mit einer Zeichenfolge auf, die eine Zahl als Argument enthält, und gibt die in eine Ganzzahl konvertierte Zahl zurück:
print (int("1") + 1)
Das obige druckt 2
.
Wenn Sie die Struktur Ihrer Liste kennen, T1 (die nur Listen enthält, nur eine Ebene), können Sie dies in Python 2 tun:
T2 = [map(int, x) for x in T1]
In Python 3:
T2 = [list(map(int, x)) for x in T1]
Sie können dies mit einem Listenverständnis machen:
T2 = [[int(column) for column in row] for row in T1]
Das innere Listenverständnis ([int(column) for column in row]
) erstellt ein list
aus int
s aus einer Folge von int
-fähigen Objekten, wie Dezimalzeichenfolgen, in row
. Das äußere Listenverständnis ([... for row in T1])
) bildet eine Liste der Ergebnisse des inneren Listenverständnisses, die auf jedes Element in T1
angewendet werden.
Das Code-Snippet schlägt fehl, wenn eine der Zeilen Objekte enthält, die von int
nicht konvertiert werden können. Sie benötigen eine intelligentere Funktion, wenn Sie Zeilen verarbeiten möchten, die nicht dezimale Zeichenfolgen enthalten.
Wenn Sie die Struktur der Zeilen kennen, können Sie das innere Listenverständnis durch einen Aufruf einer Funktion der Zeile ersetzen. Z.B.
T2 = [parse_a_row_of_T1(row) for row in T1]
Ich möchte lieber nur Verständnislisten verwenden:
[[int(y) for y in x] for x in T1]
Anstelle von int( )
setzen Sie float( )
, um Dezimalzahlen zusammen mit ganzen Zahlen zu verwenden.
Ich stimme mit den Antworten aller soweit überein, aber das Problem ist, dass sie abstürzen, wenn Sie nicht alle Zahlen haben.
Wenn Sie nicht ganze Zahlen ausschließen möchten
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 tatsächliche Ziffern. Der Grund, warum ich keine direkten Listenverständnisse verwende, ist, dass das Listenverständnis ihre internen Variablen durchläuft.
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
Versuche dies.
x = "1"
x ist eine Zeichenfolge, da sie Anführungszeichen enthält, aber eine Zahl darin ist.
x = int(x)
Da x die Nummer 1 enthält, kann ich es in eine ganze Zahl umwandeln.
Um zu sehen, ob eine Zeichenfolge eine Zahl ist, können Sie dies tun.
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)
Es sollte mit IDLE True gedruckt werden, da x eine Zahl ist.
y_test = is_number(y)
print(y_test)
Es sollte auf IDLE False gedruckt werden, da y keine Zahl enthält.
Verwenden von Listenverständnissen:
t2 = [map(int, list(l)) for l in t1]
In Python 3.5.1 funktionieren solche Dinge wie folgt:
c = input('Enter number:')
print (int(float(c)))
print (round(float(c)))
und
Enter number: 4.7
4
5
George.
Siehe 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 können auch überprüfen
if val == None: # True if input value can not be converted
pass # Note: Don't use 'if not val:'
Noch eine funktionale Lösung für Python 2:
from functools import partial
map(partial(map, int), T1)
Python 3 wird allerdings etwas unordentlich sein:
list(map(list, map(partial(map, int), T1)))
wir können das mit einem Wrapper beheben
def oldmap(f, iterable):
return list(map(f, iterable))
oldmap(partial(oldmap, int), T1)
Wenn es nur ein Tupel von Tupeln ist, wird etwas wie rows=[map(int, row) for row in rows]
den Trick tun. (Es gibt ein Listenverständnis und einen Aufruf zur Zuordnung (f, lst), der gleich [f (a) für a in lst] ist.)
Eval ist nicht was Sie tun möchten, falls in Ihrer Datenbank aus irgendeinem Grund etwas wie __import__("os").unlink("importantsystemfile")
vorhanden ist ..__ Überprüfen Sie Ihre Eingabe immer (wenn nichts anderes, wird die Ausnahme int () ausgelöst, wenn Sie einen Fehler haben Eingang).
Ich möchte eine verfügbare Option freigeben, die hier noch nicht erwähnt zu werden scheint:
rumpy.random.permutation(x)
Erzeugt eine zufällige Permutation von Array x. Nicht genau was Sie verlangt haben, aber es ist eine mögliche Lösung für ähnliche Fragen.