Lister i Python

Lister bruges når vi gerne vil lave en datasamling. Det kan være både tekst, værdier eller True/False. Her er en eksempel med frugt:

  1. ananas
  2. banan
  3. citron

Her har jeg lavet frugt listen i Python (i shell) og printet den ud:

>>> frugt = ["ananas","banan","citron"]
>>> frugt
['ananas', 'banan', 'citron']

Læg mærke til at du skal bruge [] (firkantede parenteser) når du laver denne type lister.

Hvis jeg gerne vil udskrive listens elementer kan jeg gøre det ved at skrive placeringen i listen i en firkantet parentes bagefter. Husk at Python tæller fra 0, så index-tallene vil være:

  1. ananas
  2. banan
  3. citron

Du kan altså ramme elementerne på følgende måde:

>>> frugt[0]
'ananas'
>>> frugt[1]
'banan'
>>> frugt[2]
'citron'

Arbejde med lister

Find placering i listen

Hvis du gerne vil finde hvad et elements placering skal du bruge .index(). Husk at Python tæller fra 0.

>>> frugt = ["ananas","banan","citron"]
>>> frugt.index("banan")
1

Tilføj til listen

For at tilføje til listen tilføjer man .append. Herunder tilføjer vi daddel til vores liste

>>> frugt = ["ananas","banan","citron"]
>>> frugt.append("daddel")
>>> frugt
['ananas', 'banan', 'citron', 'daddel']

Ændr et element

Her vil jeg gerne ændre det annanas til appelsin. Det gør jeg på følgende måde:

>>> frugt = ["ananas","banan","citron"]
>>> frugt[0] = "appelsin"
>>> frugt
['appelsin', 'banan', 'citron']

frugt[0] kan egentlig forstås som en variabel. Tallet 0, der står i den firkantede parentes der er det samme som den første plads i listen. Det svarer til hvad du normalt vil gøre for at ændre en variabel i Python. Her gør du det bare inde i en liste.

Fjerne element

Der er 3 måder du kan fjerne et element i liste.

.remove()
Fjerner den første værdi af sammen navn som det der er i parentesen
.pop()
Fjerner den placering i listen der er nævnt eller det sidste element
del
Fjerner det element der er nævnt i listen
.clear()
Fjerner alle elementer fra listen

https://www.w3schools.com/python/python_lists_remove.asp

.remove()

Med .remove() fjerner du et navngivet element. Her fjerner vi banan fra listen.

>>> frugt = ["ananas","banan","citron"]
>>> frugt.remove("banan")
>>> frugt
['ananas', 'citron']

Hvis listen har flere elementer der hedder det samme, så er det kun det første element der bliver fjernet:

>>> frugt = ["ananas","banan","citron","banan"]
>>> frugt.remove("banan")
>>> frugt
['ananas', 'citron',"banan"]

del

del fjerner det element der bliver nævnt, og kan også bruges til at slettet hele listen.

Her fjerner jeg igen banan:

>>> frugt = ["ananas","banan","citron"]
>>> del frugt[1]
>>> frugt
['ananas', 'citron']

Hvis jeg vil fjerne listen fuldstændig skriver jeg:

>>> frugt = ["ananas","banan","citron"]
>>> del frugt
>>> frugt
Traceback (most recent call last):
  File "<pyshell>", line 1, in <module>
NameError: name 'frugt' is not defined
>>> 

Grunden til at der kommer en fejlmeddelelse er, at Python ikke kan udskrive frugt mere ... fordi den er blevet fjernet.

.clear()

.clear() fjerner alle elementer fra en liste:

>>> frugt = ["ananas","banan","citron"]
>>> frugt.clear()
>>> frugt
[]

Brug og fjern - .pop()

Hvis du vil bruge et element fra en liste og samtidig fjerne det fra listen kan du bruge .pop(), hvor tallet i parentesen fortæller hvilket element der skal arbejdes med. Skriver du ikke et tal, så anvendes det sidste i listen.

>>> frugt = ["ananas","banan","citron"]
>>> frugt.pop(1)
'banan'
>>> frugt
['ananas', 'citron']

Læg mærke til, at banan bliver udskrevet. Du kan altså gøre to ting med en kommando.

Kopier liste

For at lave en kopi af listen bruger du .copy()

>>> frugt = ["ananas","banan","citron"]
>>> kopi_af_frugt = frugt.copy()
>>> frugt
['ananas', 'banan', 'citron']
>>> kopi_af_frugt
['ananas', 'banan', 'citron']

Antal elementer i listen

For at finde antallet af elementer i en liste skal du bruge len() - ligesom du gjorde ved tekststrengene.

>>> frugt = ["ananas","banan","citron"]
>>> len(frugt)
3

Er et element i listen

Hvis du vil tjekke om et element er i listen skal du gøre sådan her:

>>> frugt = ["ananas","banan","citron"]
>>> "ananas" in frugt
True
>>> "daddel" in frugt
False

Kør igennem hele listen

Du kan også køre igennem hele listen ved hjælp af en for-løkke:

frugt = ["ananas","banan","citron"]
for i in frugt:
	print(i)
>>> %Run test.py
ananas
banan
citron

Det er altså ikke nødvendigt at kende antallet af elementer for at gøre det.

Program - Gæt en frugt

Prøv at se det gætte-program jeg har lavet her.

frugt = ["ananas","banan","citron"]

while True:
    gæt = input("Gæt en frugt: ")
    
    if gæt in frugt:
        print("\nDu har gættet rigtigt\n")
    else:
        print("\nDet var ikke rigtigt\n")
>>> %Run test.py
Gæt en frugt: appelsin

Det var ikke rigtigt

Gæt en frugt: banan

Du har gættet rigtigt

Gæt en frugt: 

Problemet med det program er at det aldrig vil stoppe med at køre, og man kan gætte på banan alle de gange man vil.

For at fjerne det problem har vi brug for at gøre to ting:

  • Fjerne et element hvis det er gættet rigtigt
  • Stoppe programmet når der ikke er flere elementer tilbage i listen
frugt = ["ananas","banan","citron"]

while True:
    
    if len(frugt) == 0:
        print("Der er ikke mere frugt")
        break

    gæt = input("Gæt en frugt: ")
    
    if gæt in frugt:
        print("\nDu har gættet rigtigt\n")
        frugt.remove(gæt)
    else:
        print("\nDet var ikke rigtigt\n")
>>> %Run test.py
Gæt en frugt: ananas

Du har gættet rigtigt

Gæt en frugt: banan

Du har gættet rigtigt

Gæt en frugt: citron

Du har gættet rigtigt

Der er ikke mere frugt

Kan du ændre programmet, Så det også fortæller hvor mange stykker frugt der er tilbage?

Output skal ligne det herunder:

>>> %Run test.py
Der er 3 stykker frugt - gæt en af dem: appelsin

Du har gættet rigtigt

Der er 2 stykker frugt - gæt en af dem: banan

Du har gættet rigtigt

Der er 1 stykker frugt - gæt en af dem: citron

Du har gættet rigtigt

Nu er der ikke mere frugt tilbage.
Koden til ændring af programmet
frugt = ["ananas","banan","citron"]

while True:
    
    if len(frugt) == 0:
        print("Nu er der ikke mere frugt tilbage.")
        break

    gæt = input(f"Der er {len(frugt)} stykker frugt - gæt en af dem: ")
    
    if gæt in frugt:
        print("\nDu har gættet rigtigt\n")
        frugt.remove(gæt)
    else:
        print("\nDet var ikke rigtigt\n")
            

Skrivning af lister

Herover har jeg brugt en meget kort liste (frugt), som er let at overskue. Men hvis man laver længere lister kan det anbefales at skrive dem på en anden måde:

frugter = [
	"ananas",
	"banan",
	"citron",
	"daddel",
	"fersken",
	"grapefrugt",
	"hindbær",
	"jordbær"
	]

Den liste er noget nemmere at læse end denne:

frugter = ["ananas","banan","citron","daddel","fersken","grapefrugt","hindbær","jordbær"]

Brug denne opskrivning når du har mere end 3 elementer - for overblikkets skyld.

Fyld liste

Du kan fylde lister ved hjælp af funktioner. Se dette eksempel eksempel

>>> mine_tal = list(range(1,21))
>>> mine_tal
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

Du kan også tilføje bogstaver og tegn. Her skal du huske at importere string:

>>> mine_bogstaver = list()
>>> import string
>>> små_bogstaver = list(string.ascii_lowercase + "æ" + "ø" + "å")
>>> små_bogstaver
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'æ', 'ø', 'å']

ASCII har kun de engelske bostaver. Derfor skal du huske at lægge de danske bogstaver til, hvis de også skal med.

string.ascii_lowercase + "æ" + "ø" + "å"

Du kan også importere andre tegn og tal lister (husk at tilføje de danske tegn):

  • ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
  • ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  • digits = '0123456789'
  • ascii_letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  • printable = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU...
  • punctuation = '!"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~'
  • whitespace = ' \t\n\r\x0b\x0c'

Sortering af lister

Nogle gange kan der være et behov for at lister bliver sorteret i alfabetisk orden eller i værdier. Der gør du med .sort() og sorted().

.sort()
Sortere og ændrer listen
sorted(**list**)
Laver en udskrift af den sorterede liste

Her har jeg lavet et eksempel hvor en liste bliver fyldt med 20 terningkast:

from random import randrange

kast = [] # Her oprettes listen kast

for i in range(20):
    kast.append(randrange(1,7))
    
print(kast) 
>>> %Run test.py
[6, 5, 3, 3, 6, 5, 3, 1, 3, 2, 6, 5, 6, 4, 5, 4, 3, 1, 6, 3]

Hvis vi gerne vil have et overblik kan vi sortere listen

>>> kast.sort()
>>> kast
[1, 1, 2, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6]

Læg mærke til at jeg lavede programmet øverst, men arbejder videre med det i Shell!

Du skal også være opmærksom på, at vi nu har ændret den oprindelige liste. elementernes rækkefølge er blevet ændret.

Omvendt sortering

Hvis du vil have elementerne i modsat rækkefølge, indsætter du reverse=True i parentesen.

>>> kast.sort(reverse=True)
>>> kast
[6, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 3, 3, 2, 1, 1]

Sortering efter størrelse

Du kan også sortere efter størrelse ved at indsætte key=len i parentesen

>>> øer = ["Madagaskar","Fyn","Rømø"]
>>> øer
['Madagaskar', 'Fyn', 'Rømø']
>>> øer.sort(key=len)
>>> øer
['Fyn', 'Rømø', 'Madagaskar']

2-dimensionelle lister

For at lave 2-dimensionelle lister (rækker og kolonner), skal du indsætte lister i listen.

Her laver jeg 4 rækker svarende til et nummerisk tastetur

grid = [
    [1,2,3],
    [4,5,6],
    [7,8,9],
    [0]
]

For at ramme det enkelte listeelemen skal du angive hvor underlisten i listen ligger ... og så skal du angive det element du vil ramme:

Altså *listenavn* [placering i listen] [placering i underlisten]

>>> grid[1][2]
6

Forskellige listetyper

I Python findes der 3 forskellige typer af lister, som er praktiske at bruge til forskellige forhold. Indtil videre har vi kun kigget på en type, nemlig lists. De tre forskellige typer er:

  • Lister - skrives med kantede parenteser/brackets ([])
  • Tuples - skrives med almindelige parenteser (())
  • Sets - skrives med krøllede parenteser ({})

Forskel mellem lister og tuples

Lister og Tuples minder om hinanden, men tuples er statiske. Du kan altså ikke ændre indholdet i en tuple. I Python betyder det, at du skal anvende tuples, når vi taler om statiske ting f.eks: månedsnavne, medaler og regioner i Danmark.

måneder = (
	"januar",
	"februar",
	"marts",
	"april",
	"maj",
	"juni",
	"juli",
	"august",
	"september",
	"oktober",	
	"november",
	"december"
)
medaljer = (
	"Guld",
	"Sølv",
	"Bronze"
)
regioner_dk = (
	"Region Nordjylland",
	"Region Midtjylland",
	"Region Syddanmark",
	"Region Hovedstaden",
	"Region Sjælland"
)

Forskellen mellem lister og set

Forskellen mellem lister og sets er, at sets ikke kan indeholde elementer der har samme værdi, og at sets ikke er indekserede - har en fast rækkefølge). Det kan vi bruge når vi arbejder med analyser af lister. Sets vil blive gennemgået på sin eden sige, da de er smarte at bruge når der arbejdes med mængder.

Forskel på listeform

Lists
  • Fast rækkefølge (ordnet)
  • Kan have flere elementer med sammen værdi
  • Kan ændres (ændre, tilføje, fjerne)

Lister laves med [] - kantede parenteser/brackets

Tuples
  • Fast rækkefølge (ordnet)
  • Kan have flere elementer med sammen værdi
  • Kan ikke ændres

Tuples laves med () - almindelige parenteser

Sets
  • Vilkårlig rækkefølge (uordnet)
  • Elementer kan ikke have samme værdi
  • Kan ændres (ændre, tilføje, fjerne)

Sets laves med {} - krøllede parenteser