Lister II#
I dette kapitlet skal vi se videre på lister.
Fjerne objekter#
Her er noen måter vi kan fjerne objekter fra lister.
Vi kan fjerne objekter med en spesifikk indeks med
pop()
-metoden.Hvis vi vet hvilket objekt vi skal fjerne, men ikke indeksen, kan vi bruke
remove(<objekt>)
-metoden.
liste = ["1", "2", "3"]
liste.pop(1) # Fjerner objektet ved indeks 1
print(liste)
['1', '3']
liste = ["1", "2", "3", "2", "2"]
liste.remove("2")
print(liste)
['1', '3', '2', '2']
remove() fjerner bare det første objektet!
Legg merke til at remove()
-metoden bare fjerner det første objektet metoden kommer over.
For å fjerne alle matchende objekter kan vi for eksempel bruke list comprehension.
liste = ["1", "2", "3", "2", "2"]
print([x for x in liste if x != "2"])
['1', '3']
Her lager vi altså en ny liste som har alle elementene i liste
, bortsett fra "2"
.
Sette inn ved en indeks#
Vi kan sette inn et objekt ved en spesifikk indeks ved å bruke insert()
-metoden
liste = ["1", "2", "3"]
liste.insert(1, "🐍")
print(liste)
['1', '🐍', '2', '3']
Negativ indeksering#
Vi kan indeksere fra slutten en liste ved å bruke negative tall som indeks.
liste = [0, 1, 2, 3, 4]
print(f"Siste element: {liste[-1]}")
print(f"Nest siste element: {liste[-2]}")
Siste element: 4
Nest siste element: 3
Finne indeks#
For å finne indeksen til et objekt kan vi bruke index()
-metoden for lister.
nums = [4, 5, 6, 6, 7]
print(nums.index(6))
2
Legg merke til at index()
-metoden bare finner det første elementet i listen som den kommer over.
Slicing#
Vi kan hente ut flere objekter fra en liste ved å bruke en spesiell måte å indeksere som kalles list slicing på engelsk 🔪
liste = [0, 1, 2, 3, 4]
print(liste[1:4])
print(liste[2:])
print(liste[:-1])
[1, 2, 3]
[2, 3, 4]
[0, 1, 2, 3]
Som vi ser kan vi hente ut flere objekter fra en liste ved å indeksere på denne måten: liste[a:b]
. Da får vi alle objektene med indeks fra og med a
til b
, altså \([a, b\rangle \).
Sjekke om noe er i en liste#
For å sjekke om et objekt er i en liste kan vi bruke in
-nøkkelordet.
løsninger = [2, 6]
if 2 in løsninger:
print("2 er en løsning!")
2 er en løsning!
Utsagnet 2 in løsninger
returnerer True
fordi 2
er et element i løsninger
.
Telle i lister#
For å telle antallet av et spesifikt objekt i en liste kan vi bruke count()
-metoden til lister.
liste = [4, 5, 3, 4, 6, 3, 2]
print("Firere:", liste.count(4)) # Skriver ut hvor mange firere som er i listen
print("Toere:", liste.count(2)) # Skriver ut hvor mange toere som er i listen
Firere: 2
Toere: 1
Sortere lister#
Vi kan få en sortert kopi av en liste ved å bruke sorted()
-funksjonen.
tallliste = [3, 2, 9, 4]
stringliste = ["Bjarne", "Cecilie", "Arne"]
print(sorted(tallliste))
print(sorted(stringliste))
[2, 3, 4, 9]
['Arne', 'Bjarne', 'Cecilie']
Hvis vi ønsker motsatt rekkefølge kan vi sette argumentet reverse
til True
.
talliste = [3, 2, 9, 4]
print(sorted(talliste, reverse=True))
[9, 4, 3, 2]
Reversere lister#
Vi kan få en reversert kopi av en liste ved å bruker reversed()
-funksjonen.
liste = [1, 2, 3, 4]
print(list(reversed(liste)))
[4, 3, 2, 1]
Konvertere til og fra lister#
Vi ønsker ofte å lage lister av objekter for å kunne bruke metoder som å telle, sortere og reversere.
Tekst til lister#
Vi kan konvertere tekst til lister ved å bruke list()
-funksjonen.
tekst = "Parallellogram"
tekst_liste = list(tekst)
print(tekst_liste)
print("Antall med bokstav l:", tekst_liste.count("l"))
['P', 'a', 'r', 'a', 'l', 'l', 'e', 'l', 'l', 'o', 'g', 'r', 'a', 'm']
Antall med bokstav l: 4
Tall til lister#
Hvis vi skal gjøre om tall til lister, må vi gjøre de om til strings først.
tall = 456
print(tall)
print(list(str(tall)))
456
['4', '5', '6']
Lister til tekst#
Hvis vi ønsker å sette sammen en liste med strings til én sammensatt string kan vi bruke string-metoden .join()
. Vi kan bestemme hvilken string vi ønsker mellom listeelementene, hvis vi ønsker det.
tekst = "Parallellogram"
print(tekst)
print(list(tekst))
print("_".join(list(tekst)))
print(" ".join(list(tekst)))
print("".join(reversed(list(tekst))))
Parallellogram
['P', 'a', 'r', 'a', 'l', 'l', 'e', 'l', 'l', 'o', 'g', 'r', 'a', 'm']
P_a_r_a_l_l_e_l_l_o_g_r_a_m
P a r a l l e l l o g r a m
margollellaraP
List comprehension#
La oss se på en mer kompakt måte å lage lister på.
liste = []
for n in range(10):
liste.append(n)
print(liste)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Programmet over kan gjøres enda mer kompakt med list comprehension.
liste = [n for n in range(10)]
print(liste)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Wow, så enkelt 🤯
Vi kan også legge til kriterier for listen.
partall = [n for n in range(10) if n % 2 == 0]
print(partall)
[0, 2, 4, 6, 8]
Flere kule eksempler
Her er noen flere kule eksempler på lister vi kan lage.
from random import choice
bits = [choice([0, 1]) for x in range(10)]
print(bits)
Dette programmet gir oss en liste med tilfeldige bits. Altså 0
eller 1
. For eksempel [0, 1, 0, 1, 1, 1, 1, 0, 0, 1]
.
navn = ["Ruben", "Aleksander", "Nora", "Sveinung", "Oddvar", "Bård"]
navn_med_a = [x for x in navn if "a" in x or "A" in x]
print(navn_med_a)
Dette programmet gir oss en liste over alle navnene som inneholder "a"
eller "A"
i listen navn
. Det blir ['Aleksander', 'Nora', 'Oddvar']
liste = [1, 2, 3]
tekst_liste = [str(x) for x in liste]
print(tekst_liste)
Dette programmet konverterer listen med tall om til en liste med strings. Det blir ["1", "2", "3"]
map-funksjonen 🗺️
Noen ganger ønsker vi å bruke en funksjon på alle verdiene i en liste.
liste = [1, 2, 3, 4]
def kvadrer(x : float) -> float:
return x ** 2
liste = map(kvadrer, liste)
print(list(liste))
Legg merke til at vi må gjøre map
-objektet til en list
hvis vi skal printe ut resultatet.
filter-funksjonen 🗺️
Funksjonen filter
lar oss gå gjennom en liste med en funksjon og bare beholde de resultatene som gir True
.
liste = [1, 2, 3, 4, 5, 6]
def er_oddetall(x : float) -> bool:
if x % 2 == 0:
return False
return True
liste = filter(er_oddetall, liste)
print(list(liste))
Legg merke til at vi må gjøre filter
-objektet til en list
hvis vi skal printe ut resultatet. Ellers kan vi beholde det sånn det står.
Oppgaver#
Oppgave 1 🍲
Lag en liste med flere forskjellige middager.
middager = []
Skriv ut den første middagen i listen.
Skriv ut lengden til listen.
Skriv ut den siste middagen i listen. Dette skal kunne fungere selv om man legger til flere middager i listen.
Skriv ut en tilfeldig middag fra listen.
Skriv ut en sortert versjon av listen i alfabetisk rekkefølge.
Skriv ut en liste med alle middager som inneholder bokstaven
a
.
Oppgave 2 🐍
Du har fått denne teksten
tekst = "🐍🐍🦎🐊🐢🐍🐉🦕🦖🐊🦎🐢🐍🐍🐍🐊🦎🐉🐢🐍🐍🐍🐍🦎🐢🦎🐢🐍🐍🐢🐉🦕🐢🐍🐉🐊🐊🐍🦕🐢🦎🐊🐍🦕🦎🦖🦕🐍🦖🦖🐍🦖🐢🐢🐉🦕🐍"
Kopier linjen inn i Python og bruk count()
-metoden til å finne hvor mange slanger som skjuler seg i teksten.
Oppgave 3 ✂️
Lag en funksjon fjern_lange_ord
som tar inn en liste liste
og returnerer en liste hvor alle strings med lengde \(>4\) er fjernet.
print(fjern_lange_ord(["Lorem", "ipsum", "dolor", "sit", "amet"])) -> ["sit", "amet"]
Løsningsforslag
def fjern_lange_ord(liste : list) -> list:
return [x for x in liste if len(x) <= 4]
Oppgave 4 🪞
Tallet \(11\) er det samme baklengs og forlengs. Tallet \(42\) er ikke det.
Vi kan anta at alle tallene fra og med \(1\) til og med \(9\) også er de samme baklengs og forlengs.
Hva er summen av alle tallene under \(1000\) hvor tallet er det samme baklengs og forlengs?
Oppgave 5 🔢
En tverrsum (digital sum) er summen av sifrene i et tall.
For eksempel er tverrsummen av \(123 \rightarrow 1+2+3 = 6\) og \(456\rightarrow 4+5+6 = 15\).
a) Lag en funksjon digsum(n)
som tar et heltall n
og returnerer tverrsummen.
Løsningsforslag
def digsum(n : int) -> int:
s = 0
# For hvert siffer
for siffer in str(n):
s += int(siffer)
return s
Alternativt kan vi bruke list comprehension
def digsum(n : int) -> int:
return sum([int(siffer) for siffer in str(n)])
La oss fortsette å ta tverrsummen av tallet vi får som resultat helt til vi står igjen med ett ensifret heltall. Dette kan vi kalle for en gjentatt tverrsum, eller digital root på engelsk.
For eksempel vil vi få \(456\rightarrow 4+5+6 = 15 \rightarrow 1 + 5 = 6\).
b) Lag en funksjon digroot(n)
som tar et heltall n
og returnerer den gjentatte tverrsummen.
Løsningsforslag
La oss bruke funksjonen digsum(n)
fra a).
def digroot(n : int) -> int:
n_string = str(n)
# Mens vi har flere sifre enn 1
while len(n_string) > 1:
# Ta tversummen og sett n_string til den nye tverrsummen
n_string = str(digsum(n_string))
# Returner n_string, som nå bare er ett siffer
return n_string
Litt om gjentatt tverrsum 🤓
La oss se på tverrsummen av de første \(30\) tallene i tallsystemet.
print([digroot(n) for n in range(30)])
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '2']
Ser du et mønster?
Det viser seg faktisk at det finnes en enkel formel for å finne den gjentatte tverrsummen.
def digroot(n : int) -> int:
if num == 0:
return 0
else:
return n - 9*int((n- 1)/9)
Mer om dette kan du lese om på Wikipedia (lenke)