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:
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:
Du kan altså ramme elementerne på følgende måde:
>>> frugt[0]
'ananas'
>>> frugt[1]
'banan'
>>> frugt[2]
'citron'
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
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']
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.
Der er 3 måder du kan fjerne et element i liste.
.remove()
.pop()
del
.clear()
https://www.w3schools.com/python/python_lists_remove.asp
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
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()
fjerner alle elementer fra en liste:
>>> frugt = ["ananas","banan","citron"]
>>> frugt.clear()
>>> frugt
[]
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.
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']
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
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
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.
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:
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.
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")
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.
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):
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()
sorted(**list**)
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.
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]
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']
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
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 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 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.
Lister laves med [] - kantede parenteser/brackets
Tuples laves med () - almindelige parenteser
Sets laves med {} - krøllede parenteser