Hoe tekenreeksen omzetten in gehele getallen in Python?

Ik heb een tupel van tupels van een MySQL query als deze:

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

Ik wil graag alle string elementen omzetten in gehele getallen en ze terug zetten in een lijst van lijsten:

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

Ik heb geprobeerd dit te bereiken met eval maar heb nog geen fatsoenlijk resultaat gekregen.

Oplossing

int() is de standaard ingebouwde functie van Python om een tekenreeks om te zetten in een geheel getal. Je roept de functie op met een string met een getal als argument, en het geeft het getal geconverteerd naar een geheel getal terug:

print (int("1") + 1)

Het bovenstaande drukt 2 af.

Als je de structuur van je lijst kent, T1 (dat hij gewoon lijsten bevat, slechts één niveau), zou je dit in Python 2 kunnen doen:

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

In Python 3:

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

Je kunt dit doen met een lijst begrip:

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

De binnenste lijstverzameling ([int(column) for column in row]) bouwt een lijst van ints uit een reeks int-bare objecten, zoals decimale strings, in row. De buitenste lijstverzameling ([... voor rij in T1])) bouwt een lijst van de resultaten van de binnenste lijstverzameling toegepast op elk item in T1.

De code zal mislukken als een van de rijen objecten bevat die niet door int kunnen worden geconverteerd. Je hebt een slimmere functie nodig als je rijen wilt verwerken die niet-decimale strings bevatten.

Als je de structuur van de rijen kent, kun je de inner list comprehension vervangen door een aanroep van een functie van de rij. Bijv.

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

Als het slechts een tupel van tupels is, zal iets als rows=[map(int, row) for row in rows] de truc doen. (Er's een lijstbegrip en een oproep aan map(f, lst), wat gelijk is aan [f(a) voor a in lst], daar).

Eval is niet wat je wilt doen, voor het geval er'iets als __import__("os").unlink("importantsystemfile") in je database zit om de een of andere reden. Valideer altijd je invoer (als met niets anders, de uitzondering int() zal verhogen als je slechte invoer hebt).

Commentaren (0)