Kuidas teisendada stringid täisarvudeks Pythonis?

Mul on MySQL-i päringust saadud tupel sellisel kujul:

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

Ma'tahaksin teisendada kõik stringi elemendid täisarvudeks ja panna need tagasi loetelusse:

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

Proovisin seda saavutada evaliga, kuid ei'saanud veel korralikku tulemust.

Lahendus

int() on Pythoni standardne sisseehitatud funktsioon stringi teisendamiseks täisarvuks. Te kutsute seda funktsiooniga, mille argumendiks on arvu sisaldav string, ja see tagastab täisarvuks teisendatud arvu:

print (int("1") + 1)

Ülaltoodud funktsioon prindib 2.

Kui te teate oma loendi T1 struktuuri (et see sisaldab lihtsalt loendeid, ainult üks tase), siis võiksite seda teha Python 2-s:

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

Python 3-s:

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

Seda saab teha nimekirja mõistmisega:

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

Sisemine loendi mõistmine ([int(column) for column in row]) koostab rivisintolevateint-objektide, näiteks kümnendsõnade, jadastrivis. Väline loendi mõistmine ([.... for row in T1])) moodustab loendi sisemise loendi mõistmise tulemustest, mida rakendatakse iga elemendi suhtes loendisT1`.

Koodilõik ebaõnnestub, kui mõni rida sisaldab objekte, mida ei saa teisendada int abil. Te'vajate targemat funktsiooni, kui soovite töödelda ridu, mis sisaldavad mitte-detsimaalseid stringisid.

Kui te teate ridade struktuuri, võite asendada sisemise loendi mõistmise funktsiooni kutsega rea funktsioonile. Nt.

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

Kui see on ainult tupel tupelidest, siis midagi sellist nagu rows=[map(int, row) for row in rows] teeb seda. (Seal'on loendi mõistmine ja kõne map(f, lst), mis on võrdne [f(a) for a in lst], seal sees).

Eval on ei see, mida sa tahad teha, juhul kui sinu andmebaasis on mingil põhjusel midagi sellist nagu __import__("os").unlink("importantsystemfile"). Valideeri alati oma sisend (kui midagi muud ei ole, siis tõstab erand int(), kui sul on vale sisend).

Kommentaarid (0)