Python 3/Listan, sanakirjan, joukon ja generaattorin luominen kuvailemalla


Listan alkioiden määrittely kuvailemalla

muokkaa

Listan voi määritellä paitsi luettelemalla sen alkiot, myös kuvailemalla listaan kuuluvat alkiot lausekkella (list comprehension).

Listan kuvailun muoto on

'[' alkion-laskeva-lauseke 'for' alkio 'in' lista... [if-lauseke]... ']'

jossa for- ja if-lausekkeita voi olla useita.

Minimiesimerkki, joka ei tee muuta kuin kopioi annetun listan. Tämä vastaa list-funktion käyttämistä.

>>> [alkio for alkio in [1, 2, 3]]
[1, 2, 3]

Alkion-laskeva-lauseke-osasa voi alkioille tehdä jonkin operaation ennen niiden lisäämistä uuteen listaan.

>>> [alkio ** 2 for alkio in [1, 2, 3]]
[1, 4, 9]
>>> ["parillinen" if alkio % 2 == 0 else "pariton" for alkio in range(0, 10)]
['parillinen', 'pariton', 'parillinen', 'pariton', 'parillinen', 'pariton', 'parillinen', 'pariton', 'parillinen', 'pariton']

For-lausekkeita voi olla useita. Tällöin lauseke laskee kaikki for-lausekkeiden palauttamine arvojen yhdistelmät.

>>> luvut = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> [a * b for a in luvut for b in luvut]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

Useamman for-lausekkeen käyttö vastaa sisäkkäisiä for-lausekkeita. Yllä oleva koodi siis vastaa listan luomista näin.

tulokset = []
for a in luvut:
    for b in luvut:
        tulokset.append(a * b)

If-lausekkeella voi alkioita lisätä ehdollisesti.

>>> [alkio for alkio in range(0, 10) if alkio % 2 == 0]
[0, 2, 4, 6, 8]

If-lausekkeita voi olla useampia. Ne vastaavat silloin sisäkkäisiä if-lauseita.

>>> [alkio for alkio in range(0, 100) if alkio % 2 == 0 if alkio % 3 == 0]
[0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96]
>>> [x*y for x in range(1, 11) if x % 3 == 0 for y in range(1, 11) if y % 2 == 0]
[6, 12, 18, 24, 30, 12, 24, 36, 48, 60, 18, 36, 54, 72, 90]

Sanakirjan alkioiden kuvailu

muokkaa

Sanakirjan alkiot voi kuvailla vastaavalla tavalla kuin listan. Erona on, että hakasulkeiden tilalla käytetään aaltosulkeita ja alkion-laskeva-lauseke-osaan kirjoitetaan avain ja arvo kaksoispisteellä erotettuna.

>>> { 'luku' + str(n) : n for n in range(0, 10) }
{'luku0': 0, 'luku1': 1, 'luku2': 2, 'luku3': 3, 'luku4': 4, 'luku5': 5, 'luku6': 6, 'luku7': 7, 'luku8': 8, 'luku9': 9}

Joukon alkioiden kuvailu

muokkaa

Joukon alkiot voi kuvailla vastaavalla tavalla kuin listan. Erona on, että hakasulkeiden tilalla käytetään aaltosulkeita.

>>> luvut = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> {a * b for a in luvut for b in luvut}
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 50, 54, 56, 60, 63, 64, 70, 72, 80, 81, 90, 100}

Generaattorin alkioiden kuvailu

muokkaa

Generaattorin alkiot voi kuvailla vastaavalla tavalla kuin listan. Erona on, että hakasulkeiden tilalla käytetään kaarisulkeita.

>>> for val in (alkio ** 2 for alkio in range(10)):
...     print(val)
... 
0
1
4
9
16
25
36
49
64
81

Generaattori toimii kuten lista, mutta alkioita ei luoda muistiin generaattori luotaessa vaan yksi kerrallaan generaattoria kutsuttaessa, joten generaattorin käyttäminen on tehokkaampaa, jos alkioita tarvitaan vain yksi kerrallaan.