Python 3/Listan, monikon tai joukon purkaminen muuttujiin


Kuten funktion argumentit voidaa myös lista, monikko tai joukko purkaa (unpack) muuttujiin.

>>> l = [8, 2, 35]
>>> eka, toka, kolkki = l
>>> eka
8
>>> toka
2
>>> kolkki
35

Kuitenkin, jos alkioita eri määrä, kuin muuttujia joihin ne puretaan aiheutuu ValueError.

>>> eka, toka, kolkki = [8, 2, 35, 11]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 3)

Operaattorilla * voidaa osoittaa kaikki ylimääräiset arvot keräävä muuttuja.

>>> eka, toka, *loput = [8, 2, 35, 11]
>>> eka
8
>>> toka
2
>>> loput
[35, 11]

*-merkityn muuttujan ei tarvitse olla viimeinen, vaan sitä voi käyttää minkä muuttujan kohdalla tahansa.

>>> eka, *muut, vika = [8, 2, 35, 11]
>>> eka
8
>>> muut
[2, 35]
>>> vika
11
>>> *muut, tokavika, vika = [8, 2, 35, 11]
>>> muut
[8, 2]
>>> tokavika
35
>>> vika
11

Jos arvoja on vähemmän, tulee kokoavaan muuttujaan tyhjä lista. Arvoja pitää kuitenkin aina olla vähintään yhtä monta kuin *-merktsemättömiä muuttujia on.

>>> eka, toka, *loput = [8, 2]
>>> loput
[]

Monikoiden ja joukkojen alkiot voidaa purkaa vastaavasti. Huomaa, että myös näissä tapauksissa arvot kootaan listaan.

>>> eka, *muut, vika = (8, 2, 35, 11)
>>> muut
[2, 35]
>>> eka, *muut, vika = {8, 2, 35, 11}
>>> muut
[35, 2]

Joukon tapauksessa alkioiden järjestys saattaa muuttua, koska joukon alkioilla ei ole järjestystä.

Menetelmä on hyödyllinen, kun funktio palauttaa monta arvoa.

>>> osamäärä, jakojäännös = divmod(11, 3)
>>> osamäärä
3
>>> jakojäännös
2

sekä silmoukoissa, kun kaikki alkiot ovat vakiokokoisia

>>> maalintekijät = [ (1, 'Molander', '13.56'), (12, 'Jykä', '55.01'), (10, 'Vatanescu', '89.30') ]
>>> for numero, nimi, aika in maalintekijät:
...     print(f'Ajassa {aika}, {nimi} ({numero})')
... 
Ajassa 13.56, Molander (1)
Ajassa 55.01, Jykä (12)
Ajassa 89.30, Vatanescu (10)

Alaviivaa (_) on tapana käyttää muuttujan nimenä, kun emme ole kiinnostuneita sen sisällöstä, vaan muuttujan arvo asetetaan sivuvaikutuksena monta arvoa paluttavasta funktiosta.

>>> (X_train, _), (_, _) = mnist.load_data()

Sekvenssin purkaminen toiseen sekvenssin muokkaa

Sekvenssi voidaan myös purkaa toisen sekvenssin sisälle *-operaatorilla.

>>> aloituskentällinen = [ 3, 12, 15, 20, 48, 86, 99 ]
>>> vaihtopelaajat = [ 4, 22, 45 ]
>>> [ *aloituskentällinen, *vaihtopelaajat ]
[3, 12, 15, 20, 48, 86, 99, 4, 22, 45]

Sanakirjan voi purkaa toiseen **-operaattorilla.

>>> pelaaja = { 'nimi': 'Jykä', 'numero': 12, 'pelipaikka': 'libero' }
>>> { **pelaaja, 'asia': 'nilkan nyrjähdys', 'hinta': '299,90' }
{'nimi': 'Jykä', 'numero': 12, 'pelipaikka': 'libero', 'asia': 'nilkan nyrjähdys', 'hinta': '299,90'}