Python list comprehension

En rask og kompakt måte å opprette lister på.

comprehend
to understand, take into the mind, grasp by understanding; to take in, include

https://www.etymonline.com/word/comprehend

Navnet kommer fra mengdelære, set comprehension, se Wikidedia: Set-builder notation
På norsk brukes begrepet mengdebygger. se Store Norske Leksikon, mengdelære

Eksempel på mengdebygger:

$S = \{i | i < 10, i \in \mathbb{N} \}$

Det vil si, mengden S består av alle elementer i som er slik at i er mindre enn 10 og i er medlem av mengden av naturlige tall, N. Dermed, med full utlisting:

$S = \{1, 2, 3, 4, 5, 6, 7, 8, 9\}$

I Python skriver vi for det samme med list comprehension:

S = [i for i in range(1,10)]

print(S):
[1, 2, 3, 4, 5, 6, 7, 8, 9]

for i Python-uttrykket kan sammenlignes med den loddrette streken i mengdebygger-notasjonen; det som er foran streken er de elementene vi ønsker å inkludere i lista. Det som kommer etter streken forteller hvilke verdier i kan komme fra. Foran for kan vi også ha uttrykk som må beregnes for å komme fram til en verdi.

Samme eksempel som ovenfor, men med kvadrerte verdier:
S = [i*i for i in range(1,10)]

print(S):
[1, 4, 9, 16, 25, 36, 49, 64, 81]

Se mer om list comprehension hos W3Schools, List comprehesnion

In [1]:
# med betingelsen at i kvadrert skal være mindre enn 50

x = [i*i for i in range(1,10) if i*i < 50]
print(x)
[1, 4, 9, 16, 25, 36, 49]
In [2]:
# i-verdien fra range-uttrykket brukes til å beregne et tillegg til en fast startverdi (-5): -5 + i*0.5

x = [-5 + i*0.5 for i in range(21) ]
print(x[0:5])
[-5.0, -4.5, -4.0, -3.5, -3.0]
In [3]:
# eksisterende liste x brukes som input til sinus-funksjon

import math

y = [math.sin(i) for i in x]
print(y[0:5])
[0.9589242746631385, 0.977530117665097, 0.7568024953079282, 0.35078322768961984, -0.1411200080598672]
In [4]:
# plott av x mot y

import matplotlib.pyplot as plt

plt.plot(x,y)
plt.title('sin(x)')
plt.grid()
plt.show()

Glidende gjennomsnitt


$S = \{\frac{\sum D[i:i + k]}{k} | i \in range(len(D) - k) \}$

der

$ D = liste \space med \space data $
$ k = antall \space elementer \space som \space brukes \space i \space glidende \space gjennomsnitt-beregningen$

In [5]:
D = [33.881, 35.794, 29.904, 34.811, 34.768, 34.848, 27.020, 30.826, 32.820, 33.848, 35.799, 34.837, 33.853, 28.780]
k = 3

A = [sum(D[i:i + k])/k for i in range(len(D) - k)]
In [6]:
for i in A:
    print(f"{i:.4f}")
33.1930
33.5030
33.1610
34.8090
32.2120
30.8980
30.2220
32.4980
34.1557
34.8280
34.8297