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.
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]
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]
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).