Göm menyn

16. Listbyggare

Python har en speciell konstruktion för att snabbt skapa listor som inte finns i så många andra språk: listbyggare, eller på engelska list comprehension.

1. Vad kan listbyggare hjälpa till med?

I många fall när man programmerar vill man bygga upp en lista med hjälp av en for-loop. Man kanske vill ha en lista av kvadraten av alla siffror:

numbers = [1, 2, 3, 4, 5]

squared = []
for number in numbers:
    squared.append(number**2)

print(squared) # [1, 4, 9, 16, 25]

Eller en lista med alla primtal som finns i en annan lista:

candidates = [1, 2, 4, 7, 12, 15]

primes = []
for num in candidate:
    if is_prime(num):
        primes.append(num)

print(primes) # [1, 2, 7]

Eftersom det är en så vanlig operation har Python ett sätt att göra den typen av operation med ett uttryck, en så kallad listbyggare (eng. list comprehension).

Syntaxen för listbyggare ser ut på följande sätt:

[uttryck_av_x for x in iterator if uttryck_av_x]

Vilket ungefär kan expanderas till:

def fake_list_comprehension():
    result=[]
    for x in iterator:
        if condition(x):
            result.append(value(x))
    return result

Exemplet ovan där en lista av tal kvadrerades kan alltså skrivas som:

numbers = [1, 2, 3, 4, 5]

squared = [i**2 for i in numbers]

Och alla primtal i en lista kan sorteras ut med:

candidates = [1, 2, 4, 7, 12, 15]

primes = [i for i in candidates if is_prime(i)]

2. När och varför ska man använda listbyggare?

Det kanske inte är helt självklart varför listbyggare finns och när de ska användas eftersom de nästan bara är en förkortad for-loop. Listbyggare är dock lite snabbare än for och när man har vant sig vid dem är de ganska läsbara, så länge de inte är för komplicerade.

Självklart kan och ska man inte alltid använda listbyggare. Om långa beräkningar måste göras i uttrycken för värdet eller if-delen av listbyggaren så blir det svårt att läsa vad koden gör. Det går inte heller att tilldela variabler eller liknade inuti en listbyggare så det är inte alltid möjligt att utnyttja dem.

En tumregel för när de ska användas är alltså när man vill skapa en ny lista från en iterator och när beräkningarna eller kraven på vilka element som ska med i listan inte är för långa.

3. Byggare för andra datastrukturer

Listbyggare är den vanligaste byggar-strukturen i Python, men språket har även tuple- och dictionary-byggare.

Tuple-byggare

För att bygga en tupel kan man skapa en lista som man sedan konverterar till en tupel.

# Syntax
tuple([value for x in iterator if condition])

# Exempel
tuple([255 for i in range(3)]) # (255, 255, 255)

Detta gör det möjligt att dynamiskt skapa tupler med okänd längd.

Dictionary-byggare

En dictionary-byggare ser ungefär ut som listbyggare men använder {} istället för []. Eftersom varje "element" i en dictionary är en nyckel och ett värde har uttrycket för elementen två delar som är separerade med :

# Syntax
{key_from_x: value_from_x for x in iterator if condition}

# Exempel
## Skapa en dictionary från en lista nyckel-värde-par i en tuple

key_values = [("python", 1), ("java", 2), ("c", 3)]

{key: value for (key, value) in key_values} #{"python": 1, "java": 2, "c": 3}

Sammanfattning

  • Listbyggare är ett kompakt uttryck för att snabbt skapa listor.
  • Det går även att skapa tupler och dictionaries.

Extramaterial

Python-tutorial om listbyggare

Läs mer om generatorer, en typ av "lata" listbyggare


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2025-08-07