Centralt innehåll

Fakta

1. Samlingar

Datatyperna heltal, decimaltal (flyttal), boolean innehåller ett värde och kallas ofta för enkla datatyper.
Variabler som kan innehålla flera värden kallas ofta för sammansatta datatyper eller samlingar.
I Python finns samlingarna: List, Tuple, Set och Dictionary.

Vi har redan bekantat oss med listor och ska nu se hur den sammansatta datatypen tuple fungerar.
I verkliga programmeringsprojekt kan det vara viktigt att välja den samling som ger t.ex. bäst läsbarhet och prestanda. Valet av samling är beroende på vilken typ av problem som ska lösas.
Det innebär att det inte finns någon samling som är bäst utan alla har sina fördelar och valet beror på vilken typ av problem som ska lösas.

2. Tupel

Ibland vill man ha en variabel med flera värden som inte ska kunna ändras. I Python använder man tupler (tuples på engelska) för att åstadkomma det.

Tupler ser ut och fungerar ungefär som vanliga listor. Skillnaden är att skapas med parenteser istället för hakparenteser och att element inte kan ändras efter tupeln skapats.
En tupel är en slags konstant lista, vilket betyder att den inte kan ändras efter den skapats.

Eftersom tupler aldrig ändras kommer de att ha samma storlek och innehåll. Detta gör att deras interna rutiner kan köras snabbare än listor. Tupler är alltså mer effektiva än listor och lämpar sig för tillfällen då man har konstanta värden.

2.1 Skapa tupler

Tupler skapas med parenteser.

# Exempel 1.20 - Skapa en tupel
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
print(veckodag_tupel)
ger utskriften
            ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
# Exempel 1.21 - Längden på en tupel, dvs antal element
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
antal_veckodagar = len(veckodag_tupel)
print(antal_veckodagar)
ger utskriften
            7
# Exempel 1.22 - En tupel kan innehålla olika datatyper
tupel = ('måndag', 7, True, 3.14, 'söndag')
print(tupel)
ger utskriften
            ('måndag', 7, True, 3.14, 'söndag')

2.2 Ordning i tupler

Tupler har en ordning, som inte kan ändras. Element kan hämtas med ett index. Det kallas att tupler indexerade.

# Exempel 1.23 - Hämta först elementet
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
första_elementet = veckodag_tupel[0]
print(första_elementet)
ger utskriften
            måndag
# Exempel 1.24 - Hämta sista elementet
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
sista_elementet = veckodag_tupel[-1]
print(sista_elementet)
ger utskriften
            söndag

2.3 Ändring i tupler

Tupler är oföränderliga, vilket innebär att element kan inte läggas till, ändras eller tas bort.
Det blir programkörningsfel vid försök att ändra tupler.

# Exempel 1.25 - Går inte att lägga till ett element i en tupel
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
veckodag_tupel.append('vilodag')
print(veckodag_tupel)
ger utskriften
            Traceback (most recent call last):
  File "main.py", line 2, in <module>
    veckodag_tupel.append('vilodag')
AttributeError: 'tuple' object has no attribute 'append'
# Exempel 1.26 - Går inte att ändra ett element i en tupel
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
veckodag_tupel[0] = 'vilodag'
print(veckodag_tupel)
ger utskriften
            Traceback (most recent call last):
  File "main.py", line 2, in <module>
    veckodag_tupel[0] = 'vilodag'
TypeError: 'tuple' object does not support item assignment
# Exempel 1.27 - Går inte att ta bort elementet ur en tupel
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
veckodag_tupel.pop()
print(veckodag_tupel)
ger utskriften
            Traceback (most recent call last):
  File "main.py", line 2, in <module>
    veckodag_tupel.pop()
AttributeError: 'tuple' object has no attribute 'pop'
# Exempel 1.28 - Ta bort alla element ur en tupel
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
veckodag_tupel.clear()
print(veckodag_tupel)
ger utskriften
            Traceback (most recent call last):
  File "main.py", line 2, in <module>
    veckodag_tupel.clear()
AttributeError: 'tuple' object has no attribute 'clear'

*För kännedom finns det en lösning för att lägga till, ändra och ta bort element i en tupel. Det är att omvandla tupeln till en lista göra ändringen och omvandla listan tillbaka till en tupel. Men det är inget vi använder i den här kursen.

2.4 Loopa genom en tupel

För att läsa ett element i taget ur en tupel går det att loopa genom den med hjälp av index eller utan index.

# Exempel 1.29 - Loopa genom en tupel med index
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
antal_element = len(veckodag_tupel)
for i in range(antal_element):
    print(veckodag_tupel[i], end=' ')
ger utskriften
            måndag tisdag onsdag torsdag fredag lördag söndag
# Exempel 1.30 - Loopa genom en tupel utan index
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
for item in veckodag_tupel:
    print(item, end=' ')
ger utskriften
            måndag tisdag onsdag torsdag fredag lördag söndag

2.5 Dubbletter i tupler

Tupler är indexerade. Eftersom element i tupler har ett index kan det alltså finns flera element med samma värde, dvs dubbletter.

# Exempel 1.31 - En tuple tillåter dubbletter
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag', 'måndag')
print(veckodag_tupel)
ger utskriften
            ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag', 'måndag')

2.6 Metoder på en tupel

Metoden count på en tupel räknar förekomsten av element med ett visst värde och returnerar antalet.

# Exempel 1.32 - Räkna antal förekomster av ett visst värde i en tupel
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')

antal = veckodag_tupel.count('måndag')
print(f'I tupeln finns {antal} element med värdet måndag')

antal = veckodag_tupel.count('vilodag')
print(f'I tupeln finns {antal} element med värdet vilodag')
ger utskriften
            I tupeln finns 1 element med värdet måndag
I tupeln finns 0 element med värdet vilodag

Metoden index på en tupel ger index för första förekomsten av element med ett visst värde och returnerar indexet.

# Exempel 1.33 - Första förekomsten av ett visst värde
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
i = veckodag_tupel.index('lördag')
print(f'Första elementet i tupeln med värdet lördag finns på index {i}')
ger utskriften
            Första elementet i tupeln med värdet lördag finns på index 5

Metoden index på en tupel ger ett programkörningsfel om det sökta värdet inte finns i tupeln.

# Exempel 1.34 - Första förekomsten av ett visst värde
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')
i = veckodag_tupel.index('vilodag')
print(f'Första elementet i tupeln med värdet vilodag finns på index {i}')
ger utskriften
            Traceback (most recent call last):
  File "main.py", line 2, in <module>
    i = veckodag_tupel.index('vilodag')
ValueError: tuple.index(x): x not in tuple

Hur ska man kunna söka efter värde som kanske inte finns utan att programmet kraschar? Svaret är att först kontrollera om värdet finns i tupeln före anropet av metoden index.

# Exempel 1.35 - Första förekomsten av ett visst värde
veckodag_tupel = ('måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag', 'söndag')

if 'vilodag' in veckodag_tupel:
    i = veckodag_tupel.index('vilodag')
    print(f'Första elementet i tupeln med värdet vilodag finns på index {i}')
else:
    print('Elementet vilodag finns inte i tupeln')
ger utskriften
            Elementet vilodag finns inte i tupeln


Funktion Beskrivning
 len(tupel) Ger tupelns längd, dvs antal element
Metod Beskrivning
 tupel.count(e) Räknar förekomsten av element e och returnerar antalet
 tupel.index(e) Index för första förekomsten av elementet e och returnerar indexet

Se mer om metoderna på w3schools: Tuple Methods.

2.7 Sammanfattning av tupler

3. Sammanfattning


Samling Beskrivning
Lista Elementen är indexerade, dvs har en ordning. Element kan läggas till, ändras och raderas. Dubbletter är tillåtna.
Tupel Elementen är indexerade, dvs har en ordning. Element kan inte läggas till, inte ändras och inte raderas. Dubbletter är tillåtna.

Samling Syntax Index Lägga till, ändra, ta bort element Dubletter
 Lista [ ] Ja Ja Ja
 Tupel ( ) Ja Nej Ja

Begrepp

Enkel datatyp: Datatyper heltal, decimaltal (flyttal), boolean som innehåller ett värde

Sammansatt datatyp: En typ av variabel som kan innehålla flera värden.

Samling: Ett annat namn för sammansatt datatyp.

Index: Position i t.ex. en lista eller tupel.

Lista: Samling där elementen har en ordning. Element kan läggas till, ändras och tas bort.

Tupel: Samling där elementen har en ordning. Element kan inte läggas till, ändras eller tas bort.

[ ] hakparenteser, square brackets

( ) parenteser, parantheses, round brackets

Övningar

Du kan inte att lära dig att programmera genom att läsa en bok eller titta på videos. Du måste öva på att skriva kod själv och ju mer du övar desto bättre blir du.

Inlämningsuppgift

login     logout    

Exit tickets



Uppgift - Kasta mynt

Skapa en tupel med två element mynt = ('krona', 'klave') som ska användas för att slumpa fram kast med ett mynt.
Skapa och initiera en variabel antal_krona = 0 som ska användas för att räkna antalet krona vid upprepade kast med myntet.

Kasta myntet 100 gånger och räkna antalet gånger det blir krona. Vilken loop är lämplig att använda?
Använd funktionen choice som finns i modulen random för att slumpa kasten med myntet.
Använd inte en lista för att lagra alla kast, utan räkna upp variabeln antal_krona för varje kast som är krona.
Skriv ut antalet krona.

ExempelkörningEtt mynt kastas 100 gånger.
Antalet krona blev 43 stycken.

Krav: Inga break eller continue satser. Använd f-strängar vid utskrifterna.

Frivillig utmaning

Deklarera en variabel, högst uppe i koden direkt efter import och en tomrad, där värdet talar om hur många gånger myntet ska kastas, t.ex. antal_kast = 100

ExempelkörningEtt mynt kastas 100 gånger.
Antalet krona blev 52 stycken.

Sedan ska det fungera så att om man endast byter värdet på variabeln antal_kast = 100 till t.ex. antal_kast = 200 ska beräkningen och utskriften bli korrekt.

ExempelkörningEtt mynt kastas 200 gånger.
Antalet krona blev 106 stycken.