Jeg har en tupel af tupler fra en MySQL forespørgsel som denne:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
Jeg vil gerne konvertere alle stringelementerne til hele tal og sætte dem tilbage i en liste af lister:
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
Jeg forsøgte at opnå det med eval
, men didn't få noget anstændigt resultat endnu.
int()
er Pythons indbyggede standardfunktion til at konvertere en streng til en heltalsværdi. Du kalder den med en streng, der indeholder et tal som argument, og den returnerer det tal, der er konverteret til et heltal:
print (int("1") + 1)
Ovenstående udskriver 2
.
Hvis du kender strukturen af din liste, T1 (at den blot indeholder lister, kun ét niveau), kan du gø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 gøre dette med en listeforståelse:
T2 = [[int(column) for column in row] for row in T1]
Den indre listeforståelse ([int(column) for column in row]
) opbygger en liste
af int
s fra en sekvens af int
-able objekter, som decimalstrenge, i row
. Den ydre listeforståelse ([... for row in T1])
) danner en liste over resultaterne af den indre listeforståelse, der anvendes på hvert objekt i T1
.
Kodeudsnittet vil mislykkes, hvis nogen af rækkerne indeholder objekter, der ikke kan konverteres med int
. Du har brug for en smartere funktion, hvis du ønsker at behandle rækker, der indeholder ikke-decimale strenge.
Hvis du kender rækkernes struktur, kan du erstatte den indre listeforståelse med et kald til en funktion for rækken. F.eks.
T2 = [parse_a_row_of_T1(row) for row in T1]
Hvis det kun er en tupel af tupler, vil noget som rows=[map(int, row) for row in rows]
være tilstrækkeligt. (Der er en listeforståelse og et kald til map(f, lst), som er lig med [f(a) for a in lst], derinde).
Eval er ikke det, du vil gøre, hvis der af en eller anden grund er noget som __import__("os").unlink("importantsystemfile")
i din database.
Validér altid dit input (hvis du ikke har andet, vil undtagelsen int() give anledning til, hvis du har dårligt input).