Listor

En lista består av en följd (0 eller flera) av element. Elementen är av godtycklig datatyp t.ex. heltal, flyttal, strängar, listor, etc. Listor används (bl.a.) för det som i många språk kallas för arrayer. Till skillnad från språk som Java och C++ kan elementen i en och samma lista vara av olika typ.

Listobjekt är, till skillnad från strängar och tupler, ändringsbara (eng. mutable). Det betyder element i en lista kan tas bort, läggas till och bytas ut.

Listkonstruktor

Listor kan skapas genom att man räknar upp komponenterna inom []-parenteser.
Exempel:

x = 3 alist = [1, x, x+4, 'a+b', [1, 3]] print(alist) # Prints [1, 3, 7, 'a+b', [1, 3] alist = [x**2 for x in range(1,6)] print(alist) # Prints [1, 4, 9, 16, 25]

Listor kan skapas från andra objekt med list-funktionen:

alist = list('abcd') # Creates a list from a string print(alist) # Prints ['a', 'b', 'c', 'd'] alist = list((1,2,2,1)) # Creates a list from a tuple print(alist) # Prints [1, 2, 2, 1]

Operatorer för listor

Observera att dessa är i stort sett samma som för strängar och tupler.
al = [1, 2, 'a', [3.5 + 2, 4]] print(al) # Prints [1, 2, 'a', [5.5, 4]] print(al + 2*['x']) # Prints [1, 2, 'a', [5.5, 4], 'x', 'x'] al[2] = 3 print(al) # Prints [1, 2, 3, [5.5, 4]] al[2:] = [1, 3, 5] print(al) # Prints[1, 2, 1, 3, 5] al[2:] = ['x', 'y'] print(al) # Prints [1, 2, 'x', 'y'] al[2:] = [] print(al) # Prints [1, 2] print(1 in al) # Prints True print(1 not in al) # Prints False

 

 

Fler skivningsoperationer

I skivningsoperationer kan det vara användbart att specificera positioner utanför listans gränser. Observera hur man når tänkta platser före den första!
KodVärdeKommentar
l = [0, 1, 2, 3, 4, 5, 6]
l[-2] 5 Näst sista elementet.
l[-2:] [5, 6] Näst sista elementet och till slutet.
l[-2:100] [5, 6] OK att ange en för stor övre gräns.
l[-7] 0 Första elementet i en lista med 7 element.
l[-1 : 3] [] Observera att -1 refererar sista elementet och inte den tänkta platsen före första elementet.
l[-8 : 3] [0, 1, 2] -8 refererar den tänkta platsen före första elementet i en lista med 7 element.
l[-len(l)] 0 Första elementet i en godtycklig lista.
l[-len(l)-1 : -len(l)+2] [0, 1] I princip en lista med tre element men första index är utanför så det blir bara två.
l[-len(l)-1 : -len(l)+2] [0, 1, 2] I princip en lista med fem element men första två index är utanför så det blir bara tre.

Funktioner för listor

Funktion Betydelse Exempel
len Antal element (på toppnivå) i listan. len([1, 2, [a, b, c]]) -> 3  
list Skapar nytt listobjekt från lista, sträng eller tupel. list('ab') -> ['a', 'b']
max Största elementet. max([1, 2, 3]) -> 3
min Minsta elementet. min(['x', 'a', 'b']) -> 'a'
str Returnerar listan som en sträng. str([1, 2]) -> '[1, 2]'
sum Summan av elementen. Elementen måste vara numeriska. sum([1, 2, 3]) -> 6
sorted Returnerar en sorterad lista. Elementen måste ha storleksrelationer. sorted([2, 3, 1]) -> [1, 2, 3]
sorted(['y', 'x']) -> ['x', 'y']

Listmetoder

Listklassen har ett stort antal metoder. Se den officiella dokumentationen för en fullständig förteckning och detaljer.
Metod Betydelse Exempel
append Lägger till ett element sist. al = [1, 2]
al.append(3)
print(al) -> [1, 2, 3]
clear Tar bort alla element ut listan.
copy Skapar en kopia av listan dvs ett nytt objekt med samma innehåll.
count Räknar antalet förekomster visst element.   [1, [1, 2], 1].count(1) -> 2
[1, [1, 2], 1].count([1, 2]) -> 1  
extend Lägger till alla element från en annan lista. al = [3, 5]
al.extend([1, 5])
al -> [3, 5, 1, 5]
index Returnerar index för första förekomst av ett element. al.index(5) -> 1
al.index(1) -> 2
insert Stoppar in ett nytt element på angivet index. al.insert(2,'b')
al -> [3, 5, 'b', 1, 5]
pop Tar bort och returnerar sista elementet. x = al.pop()
x -> 5
al -> [3, 5, 'b', 1]
remove Tar bort första förekomst av angivet element. al.remove('b')
al -> [3, 5, 1]
reverse Vänder på listan al.reverse()
al -> [1, 5, 3]
sort Sorterar listan al.sort()
al -> [1, 3, 5]
Observera: Alla metoderna utom copy, count och index modifierar listan.

Att skriva ut listor

Uttrycket print(lista) skriver hela listan på en rad medan koden
for e in lista: print(e)
skriver ett element per rad.

Hur ska man göra om man vill skriva t.ex. fem element per rad?

Funktionen print har en nyckelordsparameter end som avgör vad som ska skrivas som sista värde. Dess defaultvärde är '\n' vilket således ger ett radbyte. Om man anger end='' som parameter undviker man alltså radframmatning. Om man håller reda på hur många värden som skrivits ut kan man se till att radbrytningen bara sker t.ex. efter vart femte element.

Koden
lista = [4, 8, 12, 31, 23, -2, 81, 97, 42, 36, 17, 8, 26, 0] n = 0 # Antalet utskrivna värden for x in lista: print(x, end='') n += 1 if n % 5 == 0 or n == len(lista): print() # Radbyte else: print(' ', end='') # Mellanrum, inget radbyte
ger utskriften
4 8 12 31 23 -2 81 97 42 36 17 8 26 0
(Utskriften blir snyggare om man i print-satsen ser till att varje värde tar lika stor plats t.ex. genom att skriva print(f'{x:5d},' end=' '). Se minilektionen om formatering!)

I ovanstående lösning räknar vi själva index i listan. Python har dock en funktion enumerate som kan göra det automatiskt:

for i, x in enumerate(l, start=1): print(f'{x:5d}', end='') if i % 5 == 0 or i == len(l): print() # Radbyte else: print(' ', end='') # Mellanrum, inget radbyte
som ger utskriften
4 8 12 31 23 -2 81 97 42 36 17 8 26 0

start-parametern till enumerate anger att den ska börja räkna från 1 i stället för 0 (annars blir radindelningen fel).

Listbyggare

Python har en konstruktion som på engelska heter list comprehensions som vi översätter till listbyggare.

Detta är ett enkelt och elegant sätt att konstruera listor. Vi demonstrera det med några exempel:

KodVärdeKommentar
l = [x for x in range(8)] Skapar en lista från ett range-objekt
l [0, 1, 2, 3, 4, 5, 6, 7]
[x*x for x in l] [0, 1, 4, 9, 16, 25, 36, 49] Kvadrater på talen i listan
[x for x in l if x%2 == 1] [1, 3, 5, 7] Alla udda tal i listan
[x*x for x in l if x*x%2 == 0] [0, 4, 16, 36] Alla jämna kvadrater

Tillbaka

Valid CSS!