Föreläsning 3
Inbyggda datastrukturer och vanliga metoder, dokumentation och for-slingor
Dagens agenda
Labbpartner?
Listor
Kapitel 3 i Möbius
Tidigare: Varje variabel sparar ett eget värde
# Tre variabler som sparar olika värden men som är kopplade till samma "Person"
�namn = "Kalle Anka"
telefonnummer = "123 456 78”
födelsedag = "09-06-1934"
namn1 = "I-or"
telefonnummer1 = ”369 333 27”
födelsedag1 = ”25-12-1924"
namn2 = "Nemo"
telefonnummer2 = ”481 444 36"
födelsedag2 = "18-05-2003"
namn4 = "Spindelmannen"
telefonnummer4 = "246 80 10"
födelsedag4 = "01-08-1962"
namn3 = "Bambi"
telefonnummer3 = "123 711 13"
födelsedag3 = "09-08-1942"
Det blir snabbt väldigt många variabler att hålla koll på!
Lösning: Datastruktur som sparar fler värden!
# Tre variabler som sparar olika värden men som är kopplade till samma "Person"
�namn = "Kalle Anka"
telefonnummer = "123 456 78”
födelsedag = "09-06-1934"
kalle_anka =
"Kalle Anka",
"123 456 78",
"09-06-1934"
Portföljen representerar en lista i Python
Variabeln kalle_anka håller koll på alla Kalles värden!
Listor
En lista i Python skrivs med hakparenteser: []
Innehållet i listan separeras med komman: ,
Vi kan till och med blanda datatyper i samma lista!
# Exempel 1
�kalle_anka = ["Kalle Anka",
"123 456 78",
"09-06-1934"]
# Exempel 2
blandlista = ["avokado", 32,
["körsbär", 42.3],
421.3]
Listor och index
Elementen i en lista är ordnade, varje element har en plats:
kalle_anka = ["Kalle Anka", "123 456 78", "09-06-1934"]
Värde | "Kalle Anka" | "123 456 78" | "09-06-1934" |
Index: | 0 | 1 | 2 |
Komma åt element i listan
kalle_anka = ["Kalle Anka", "123 456 78", "09-06-1934"]
print(kalle_anka[0])
kalle_anka[1] = "012 345 67" # ändrar telefonnummret på index 1
Värde | "Kalle Anka" | "123 456 78" | "09-06-1934" |
Index: | 0 | 1 | 2 |
Listmetoder & dokumentation
Lägga till element i listan med append(x)
kalle_anka = ["Kalle Anka", "123 456 78", "09-06-1934"]
kalle_anka.append("Kajsa Anka")
Värde | "Kalle Anka" | "123 456 78" | "09-06-1934" | "Kajsa Anka" |
Index: | 0 | 1 | 2 | 3 |
Vi lägger till en emergency contact
Kajsa hamnar på index 3
Lägga till element i listan med insert(i, x)
kalle_anka = ["Kalle Anka", "123 456 78", "09-06-1934"]
kalle_anka.insert(2, "Kajsa Anka")
Värde | "Kalle Anka" | "123 456 78" | "Kajsa Anka" | "09-06-1934" |
Index: | 0 | 1 | 2 | 3 |
Var hamnar Kajsa i listan?
Kajsa hamnar på index 2
Insert() vill ha ett index
Pythondokumentationen
Titta i dokumentationen för fler användbara listmetoder!
PS.
W3Schools har också en bra dokumentation av listmetoder – som kan vara lite enklare att förstå.
For-slingor
Listor och index
Om vi vill skriva ut alla element i en lista är det bra att använda en for-slinga.
kalle_anka = ["Kalle Anka", "Kajsa Anka", "123 456 78", "09-06-1934"]
for information in kalle_anka:
print(information)
�Ger:
Kalle Anka
Kajsa Anka
123 456 78
09-06-1934
information är en tillfällig variabel som betecknar elementen i listan
Komihåg: While-slingan
While fortsätter att loopa så länge ett visst villkor är uppfyllt!
while smuttsiga_tänder:
🡪 Fortsätt borsta tänderna!
For-slingan
For loopar precis så många gånger som du ber den att loopa!
for 2 minuter:
🡪 Fortsätt borsta tänderna!
Slingor i vardagen
Obs detta är inte korrekt syntax i python!
range(start, stop, steg)
Vilka parametrar ska vi stoppa in i range() för att få följande sekvenser?
Start, stop, steg:
range(4) → 0 1 2 3
range(10, 0, -2 ) → 10 8 6 4 2
For-slingor med range
For-slingor är också bra om vi vet hur många gånger en slinga ska köras.
for i in range(4):
print(i, end =" ")
�Ger:
0 1 2 3
i är en tillfällig variabel som betecknar elementen i listan
Söka efter ett element med en for-slinga
tal = [42, 56, 2, 51, 89, 32]
�minsta = tal[0]
for i in range(1, len(tal)):
if minsta > tal[i]:
minsta = tal[i]
print("Minsta talet är:", minsta)
Vilka värden kommer i att få?
len(x) ger antalet element i listan x
Lägg till element med en for-slinga
antal_kakor = int(input("Hur många kakor vill du beställa? "))
kakorder = []
for i in range(antal_kakor):
kaka = input("Vad heter kaka nr " + str(i+1)+ "? ")
kakorder.append(kaka)
print("Din order:", kakorder) #skriver ut listan när slinga är klar
Observera att range() vill ha heltal!
Nästlade for-slingor
for i in range(1,4):
for j in range(1,4):
print(i*j, end = " ")
print()
Vad händer här?
Resultat:
1 2 3
2 4 6
3 6 9
Komihåg röran!
namn = "Kalle Anka"
telefonnummer = "123 456 78”
födelsedag = "09-06-1934"
namn1 = "I-or"
telefonnummer1 = ”369 333 27”
födelsedag1 = ”25-12-1924"
namn4 = "Spindelmannen"
telefonnummer4 = "246 80 10"
födelsedag4 = "01-08-1962"
namn3 = "Bambi"
telefonnummer3 = "123 711 13"
födelsedag3 = "09-08-1942"
kalle_anka = ["Kalle Anka", "123 456 78", "09-06-1934"]
nemo = [”Nemo", ”481 444 36", ”18-05-2003"]
bambi = [”Bambi", "123 711 13", "09-08-1942"]
spindelmannen = [”Spindelmannen", ”246 80 10", "01-08-1962"]
ior = [”I-or", ”369 333 27", ”25-12-1924"]
namn2 = "Nemo"
telefonnummer2 = ”481 444 36"
födelsedag2 = "18-05-2003"
Hur kan vi spara all denna information i en variabel?
Lista med listor!
kalle_anka = ["Kalle Anka", "123 456 78", "09-06-1934"]
nemo = [”Nemo", ”481 444 36", ”18-05-2003"]
bambi = [”Bambi", "123 711 13", "09-08-1942"]
spindelmannen = [”Spindelmannen", ”246 80 10", "01-08-1962"]
ior = [”I-or", ”369 333 27", ”25-12-1924"]
telefonbok = [["Kalle Anka", "123 456 78", "09-06-1934"],
[”Nemo", ”481 444 36", ”18-05-2003"],
[”Bambi", "123 711 13", "09-08-1942"],
[”Spindelmannen", ”246 80 10", "01-08-1962"],
[”I-or", ”369 333 27", ”25-12-1924"]]
Observera de yttre parenteserna!
Hur kommer vi åt Nemos telefonnummer?
nemos_tel = telefonbok[1][1]
Nästlade for-slingor med matriser
matris = []
for i in range(1,4):
rad=[]
for j in range(1,4):
rad.append(j*i)
matris.append(rad)
print(matris)
print(matris[1][2])
Ger: [[1, 2, 3], [2, 4, 6],
[3, 6, 9]]
�6
Visualisera kod med python tutor!
Inbyggda datastrukturer
Kapitel 3 & 4 i Möbius
Listor och index
kalle_anka = ["Kalle Anka", "123 456 78" , "Kajsa Anka", "09-06-1934"]
Värde | "Kalle Anka" | "123 456 78" | "Kajsa Anka" | "09-06-1934" |
Index: | 0 | 1 | 2 | 3 |
Index: | -4 | -3 | -2 | -1 |
Listor kan indexeras både framifrån och bakifrån
Tupler
Liknar listor men går inte ändra. Kan ha flera element som ser likadana ut men du kan inte lägga till eller ändra en tuple efter att den skapats.�
kalle_anka_tuple = ("Kalle Anka", "123 456 78", "09-06-1934")
En tuppel har index precis som listor.
��
kalle_anka_tuple[2]
kalle_anka_tuple[-1]
Komihåg: Vi måste lägga till Kajas från början om hon ska vara med!
Kan ha dubbletter!
har värdet "09-06-1934"
har värdet "09-06-1934"
Vilka värden ger dessa indexeringar?
Set
Ett set är en datatyp där element inte har någon ordning. I ett set kan du lägga till och ta bort element, men inte dubbletter, varje värde måste vara unikt.
kalle_anka_mängd = {"Kalle Anka", "123 456 78", "Kajsa Anka", "09-06-1934"}
Kan inte ha dubbletter!
"Kalle Anka"
"123 456 78"
"09-06-1934"
"Kajsa Anka"
Oordnat!
Setoperationer
.remove() - tar bort ett element, t.ex. kalle_anka_mängd.remove("123 456 78")
.add() - lägger till ett element, t.ex. kalle_anka_mängd.add("987 654 32")
kalle_mängd = {"Kalle Anka", "987 654 32", "Kajsa Anka", "09-06-1934"}
Kalle har bytt nummer igen…
Vad ger de här operationerna?
kalle_mängd = {"Kalle Anka", "987 654 32", "Kajsa Anka", "09-06-1934"}
kajsa_mängd = {"Kajsa Anka", "987 654 32", "Kalle Anka", "09-01-1937"}
"Kalle Anka"
"987 654 32"
"09-06-1934"
"Kajsa Anka"
"09-01-1937"
kalle_mängd.difference(kajsa_mängd)
kalle_mängd.union(kajsa_mängd)
kalle_mängd.intersection(kajsa_mängd)
For-slinga
Konvertera mellan lista och set
Uppgift: bli av med dubbletter i en lista
dubbletter = [3, 4, 2, 4, 5, 6]
singellista = []
for element in dubbletter:
if element not in singellista:
singellista.append(element)
print(singellista)
Ger:
[3, 4, 2, 5, 6]
dubbletter = [3, 4, 2, 4, 5, 6]
singellista = list(set(dubbletter))
Ger:
[2, 3, 4, 5, 6]
Dictionaries
Ett element i en dictionary (hashtabell eller uppslagsverk på svenska), består av en nyckel och ett korresponderande värde. T.ex.:
kakpriser = {"Hallongrotta" : 34, "Maräng": 37, "Kokostoppar": 26}
Nyckel-värde-par!
I det här fallet är värdet priset och nyckeln kaknamnet (vi kommer ihåg namnet på kakan och vill söka efter priset)
Elementen i en dictionary har ingen ordning. För att komma åt ett värde behöver vi nyckeln.
Syntax
dict_namn = {nyckel1 : värde1, nyckel2 : värde2}
Att lägga till element i en dictionary
kakpriser[”Chokladbiskvi"] = 45
Nyckel
Värde
kaka = input("Vilken kaka vill du lägga till?")
pris = int(input("Vad ska kakan kosta? "))
�kakpriser[kaka] = pris
Skapa en tom dictionary och lägg till element
godis_pris = {}
ANTAL_SORTER = 2
for i in range(ANTAL_SORTER):
godis = input("Vilken godis vill du lägga till?")
pris = int(input("Vad kostar den? "))
godis_pris[godis] = pris
Hur lägger vi in nyckel-värde-paret i dictionaryt?
Hur kan vi komma åt värdena?
Vi behöver nyckeln:
kakpriser = {"Hallongrotta" : 34, "Maräng": 37, "Kokostoppar": 26}
kakpriser["Maräng"]--> Ger oss värdet 37
Vi kan använda .keys() för att komma åt alla nycklar och med hjälp av de även komma åt värdena.
for nyckel in kakpriser.keys():
print(nyckel, "har värdet" kakpriser[nyckel])
Dictionary med listor som värden
telefonbok = {"Kalle Anka" : ["987 654 32", "09-06-1934"],
"Nemo" : ["481 444 36", ”18-05-2003"],
"Bambi" : ["123 711 13", "09-08-1942"],
"Spindelmannen" : ["246 80 10", "01-08-1962"],
"I-or" : ["369 333 27", "25-12-1924"]}
Vi behöver inte komma ihåg vilken plats i listan personerna ligger!
Nu får vi Nemos nummer genom att skriva:
telefonbok[”Nemo”][0]
Hur söker vi efter Nemos nummer?
Dictionary med listor som värden
for person in telefonbok.keys():
print(person, "har informationen", telefonbok[person])
�Här får vi t.ex.: Kalle Anka har informationen [987 654 32, 09-06-1934]
for person in telefonbok.keys():
print(person, "har informationen:", end= " ")
for info in kontaktbok[person]:
print( info, end= " ")
print()
�Här får vi t.ex.: Kalle Anka har informationen 987 654 32 09-06-1934
Listreferenser
Vad händer om du kör denna kod?
Fokusera på den här raden!
Listreferenser: ingen kopia av listan
Python skapar ingen kopia av orginallista utan en referens (länk) från ny_lista till orginallista. Vi brukar kalla den länken en pekare!
ny_lista är som en genväg till orginallista
Labb 1
Sten, sax, påse
Deadline: Fredag 10/11