Ako previesť reťazce na celé čísla v jazyku Python?

Z dotazu MySQL mám takýto tuple tuplov:

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

Chcel by som previesť všetky reťazcové prvky na celé čísla a vrátiť ich späť do zoznamu zoznamov:

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

Snažil som sa to dosiahnuť pomocou eval, ale zatiaľ som nedostal žiadny slušný výsledok.

Riešenie

int() je štandardná vstavaná funkcia jazyka Python na prevod reťazca na celočíselnú hodnotu. Zavoláte ju s reťazcom obsahujúcim číslo ako argument a funkcia vráti číslo prevedené na celé číslo:

print (int("1") + 1)

Vyššie uvedené číslo vypíše 2.

Ak poznáte štruktúru vášho zoznamu T1 (že jednoducho obsahuje zoznamy, len na jednej úrovni), môžete to urobiť v Pythone 2:

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

V Pythone 3:

T2 = [list(map(int, x)) for x in T1]
Komentáre (2)

Môžete to urobiť pomocou porozumenia zoznamu:

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

Vnútorné chápanie zoznamu ([int(stĺpec) pre stĺpec v riadku]) vytvorí list intov zo sekvencie objektov, ktoré možno chápať ako int, napríklad desatinné reťazce, v riadku. Vonkajšie chápanie zoznamu ([... for row in T1])) vytvorí zoznam výsledkov chápania vnútorného zoznamu aplikovaného na každú položku v T1.

Úryvok kódu zlyhá, ak niektorý z riadkov obsahuje objekty, ktoré sa nedajú konvertovať pomocou int. Ak chcete spracovať riadky obsahujúce nedecimálne reťazce, budete potrebovať inteligentnejšiu funkciu.

Ak poznáte štruktúru riadkov, môžete vnútorné chápanie zoznamu nahradiť volaním funkcie daného riadku. Napr.

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

Ak ide len o tuple tuplov, postačí niečo ako rows=[map(int, row) for row in rows]. (Je tam pochopenie zoznamu a volanie map(f, lst), ktoré sa rovná [f(a) pre a v lst].)

Eval nie je to, čo chcete urobiť, v prípade, že vo vašej databáze je z nejakého dôvodu niečo ako __import__("os").unlink("importantsystemfile"). Vždy overujte vstup (ak ničím iným, výnimka int() sa vyvolá, ak máte zlý vstup).

Komentáre (0)