Joskus ohjelmassa saatetaan tarvitaan kokoelmaa, joka sisältää alkioita jonkin yksinkertaisen kaavan mukaan (esim. kokonaislukujen neliöitä). Tällöin voitaisiin alustaa muuttuja tyhjällä kokoelmalla ja käyttää toistorakennetta, joka syöttää kokoelmaan arvoja. Tässä esimerkki, jossa tehdään lista kokonaislukujen 1 - 10 neliöistä.
Code Block |
---|
>>> L = [] >>> for i in range(1, 11): L.append(i * i) >>> L [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] >>> |
Tähän on kumminkin Pythonissa kätevämpi keino list comprehension - jolle en löytänyt suomenkielistä nimeä. Se on lauseke, jossa on ikäänkuin for toistorakenne kokoelman sisässä; aluksi listan sisään tulee jokin ilmaisu, jossa käytetään jotain muuttujaa ja sen jälkeen for toistorakenteen ylimmäisin osa ilman kaksoispistettä. Näin synnytetään for toistorakenteen mukaiset arvot, käytetään niitä halutussa lausekkeessa ja sijoitetaan listan alkoiksi.
Tässä aiempi esimerkki käyttäen list comprehensonia.
Code Block |
---|
>>> L = [i * i for i in range(1, 11)] >>> L [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] >>> |
List comprehesnsionissa voi myös käyttää useita for rakenteita peräkkäin, jolloin ne toimivat ikäänkuin sisäkkäiset for toistorakenteet. Tässä tehdään kaikki kertotaulun luvuilla 1 - 5 tulokset.
Code Block |
---|
>>> [i * j for i in range(1, 5) for j in range(1, 5)] [1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16] >>> |
Nimestään huolimatta tämä tekniikka toimii myös joukoille ja hakurakenteille. Niissä täytyy vain käyttää vastaavasti aalto sulkuja ja hakurakenteessa erottaa avain ja arvo kaksoispisteellä. Tässä niistä esimerkki.
Code Block |
---|
>>> {i ** 3 for i in range(1, 10)} {64, 1, 8, 512, 343, 216, 729, 27, 125} >>> >>> D = {i : i ** 3 for i in range(1, 10)} >>> D[3] 27 >>> D[7] 343 >>> D {1: 1, 2: 8, 3: 27, 4: 64, 5: 125, 6: 216, 7: 343, 8: 512, 9: 729} >>> |
Tässä voi myös käyttää ehtoa avainsanan if avulla; jos avainsanan if jälkeinen totuusarvo on tosi, alkio lisätään kokoelmaan, muuten ei. Ehtoja voi olla peräkkäin useampikin. Tässä taas tehdään kokonaislukujen neliöistä, mutta valitaan vain parittomat luvut.
Code Block |
---|
>>> [i * i for i in range(1, 10) if i % 2] [1, 9, 25, 49, 81] >>> |