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]

Oppgaver#

Oppgave 1 🍲

Lag en liste med flere forskjellige middager.

middager = []
  1. Skriv ut den første middagen i listen.

  2. Skriv ut lengden til listen.

  3. Skriv ut den siste middagen i listen. Dette skal kunne fungere selv om man legger til flere middager i listen.

  4. Skriv ut en tilfeldig middag fra listen.

  5. Skriv ut en sortert versjon av listen i alfabetisk rekkefølge.

  6. 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.

Svar:

Oppgave 3 🪞

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?

Svar:

Oppgave 4 🔢

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.

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.