Jeg har en tuple av tupler fra en MySQL-spørring som dette:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
Jeg vil gjerne konvertere alle strengelementene til heltall og sette dem tilbake i en liste med lister:
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
Jeg prøvde å oppnå det med eval
, men fikk ikke noe anstendig resultat ennå.
int()
er Pythons innebygde standardfunksjon for å konvertere en streng til en heltallsverdi. Du kaller den med en streng som inneholder et tall som argument, og den returnerer tallet konvertert til et heltall:
print (int("1") + 1)
Ovennevnte skriver ut 2
.
Hvis du kjenner strukturen til listen din, T1 (at den bare inneholder lister, bare ett nivå), kan du gjøre dette i Python 2:
T2 = [map(int, x) for x in T1]
I Python 3:
T2 = [list(map(int, x)) for x in T1]
Du kan gjøre dette med en listeforståelse:
T2 = [[int(column) for column in row] for row in T1]
Den indre listeforståelsen ([int(kolonne) for kolonne i rad]
) bygger en liste
av int
er fra en sekvens av int
-objekter, som desimalstrenger, i rad
. Den ytre listeforståelsen ([... for rad i T1])
) bygger en liste over resultatene av den indre listeforståelsen anvendt på hvert element i T1
.
Kodebiten vil mislykkes hvis noen av radene inneholder objekter som ikke kan konverteres med int
. Du trenger en smartere funksjon hvis du vil behandle rader som inneholder ikke-desimale strenger.
Hvis du kjenner strukturen til radene, kan du erstatte den indre listeforståelsen med et kall til en funksjon av raden. F.eks.
T2 = [parse_a_row_of_T1(row) for row in T1]
Hvis det's bare en tuple av tupler, noe som rows=[map(int, rad) for rad i rader]
vil gjøre susen. (Det's en liste forståelse og et kall til map(f, lst), som er lik [f(a) for a i lst], i det).
Eval er ikke det du vil gjøre, i tilfelle det er noe som `import("os").unlink("viktigsystemfil") i databasen din av en eller annen grunn. Valider alltid inndataene dine (om ikke annet vil unntaket int() oppstå hvis du har feil inndata).