1 of 41

Föreläsning 3

Inbyggda datastrukturer och vanliga metoder, dokumentation och for-slingor

2 of 41

Dagens agenda

  1. Inbyggd datastruktur: Lista
  2. Listmetoder & dokumentation
  3. For-slingor
  4. Fler inbyggda datastrukturer:
    1. Tuplar
    2. Sets
    3. Dictionaries

3 of 41

Labbpartner?

4 of 41

Listor

Kapitel 3 i Möbius

5 of 41

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å!

6 of 41

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!

7 of 41

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]

8 of 41

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

9 of 41

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

10 of 41

Listmetoder & dokumentation

11 of 41

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

12 of 41

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

13 of 41

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

14 of 41

For-slingor

15 of 41

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

16 of 41

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!

17 of 41

range(start, stop, steg)

Vilka parametrar ska vi stoppa in i range() för att få följande sekvenser?

  • 0, 1, 2, 3
  • 10, 8, 6, 4, 2

Start, stop, steg:

  • Start är 0 om inget annat anges
  • Stop måste anges och är exkluderande
  • Steg är 1 om inget anges

range(4) → 0 1 2 3

range(10, 0, -2 ) → 10 8 6 4 2

18 of 41

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

19 of 41

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

20 of 41

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!

21 of 41

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

22 of 41

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?

23 of 41

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]

24 of 41

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!

25 of 41

Inbyggda datastrukturer

Kapitel 3 & 4 i Möbius

26 of 41

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

27 of 41

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?

28 of 41

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!

29 of 41

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…

30 of 41

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)

31 of 41

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]

32 of 41

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}

33 of 41

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

34 of 41

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?

35 of 41

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])

36 of 41

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?

37 of 41

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

38 of 41

Listreferenser

39 of 41

Vad händer om du kör denna kod?

Fokusera på den här raden!

40 of 41

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

41 of 41

Labb 1

Sten, sax, påse

Deadline: Fredag 10/11