Göm menyn

Mer om datatyper

Förutom listor och strängar finns det en del andra användbara datatyper i Python. Vi kommer här gå igenom datatyperna tuple och dictionary.

Tupler

En tupel (eng. tuple) kan ses som en konstant lista. Storleken och innehållet kan inte förändras utan en ny kopia måste skapas med de nya förändringarna. (Detta kommer att beskrivas i mer detalj i nästa kapitel) Tupler ser ut och fungerar som vanliga listor, men initieras med parenteser istället för hakparenteser. Tupler kan också initieras utan parenteser, även om det inte är helt rekommenderat då det inte är lika tydligt.

Dokumentation

Här kommer några exempel på hur tupler fungerar.

>>> tup = (1, 2, 3)
>>> tup2 = 1, 2, 3
>>> tup2
(1, 2, 3)
>>> tup[1]
2
>>> len(tup)
3
>>> for elem in tup:
...     print(elem, end="*")
...
1*2*3*

>>> tup[1] = 'hello'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment 

>>> tp2 = 'a', 'b', 'c'
>>> tp2
('a', 'b', 'c')
>>> 1,
(1,)

>>> persons = [("Linus", 50), ("Steve", 56)]
>>> for name, age in persons:
...     print(name, age)
...
Linus 50
Steve 56

Användning av tupler

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

months = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', \
          'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')

En användbar konvention är att använda tupler där man har strukturerad data och informationen på olika positioner har olika roller, och listor när man har sekvenser med data av samma typ. Till exempel:

date = (2012, 9, 11)
dates = [(2012, 8, 27), (2012, 8, 29), (2012, 9, 3)]

Dictionaries

Dictionaries är listor av par som man kan använda som uppslagstabeller. Varje par består av en nyckel och ett värde. Genom att ange en nyckel får man tillbaka parets värde (kan liknas vid listans index). I övrigt fungerar dictionaries ungefär som listor.

Dokumentation

>>> dictionary = {'a': 45, 'b': 39, 'c': 19} 
>>> dictionary['a']
45
>>> dictionary['d'] = 4711
>>> dictionary
{'a': 45, 'c': 19, 'b': 39, 'd': 4711} 
>>> len(dictionary)
4
>>> 'b' in dictionary 
True
>>> 'q' in dictionary 
False

>>> dictionary['q']
Traceback (most recent call last):
File "<stdin>", line 1, in <module> 
KeyError: 'q'

>>> for elem in dictionary:
...    print(elem, end="*")
...
a*b*c*d*

Samma nyckel kan inte förekomma två gånger. Ordningen mellan paren (så som de visas när man t.ex. skriver ut dem) är egentligen ointressant och därför lämnar Python inga garantier för att ordningen bevaras.

>>> {1: 4, 'a': 47, (1, 2): 'hejsan'}
{'a': 47, 1: 4, (1, 2): 'hejsan'}

En mer allmän benämning på den här typen av datastruktur är hashtabell. Grundtanken är att det finns en algoritm som beräknar ett hashvärde för varje nyckel. Detta hashvärdet används sedan som ett internt index för att slå upp värdet snabbt. I andra språk kan strukturer som likanr dictionaries även kallas för hash map, map och associativa arrayer.

Nycklarnas datatyp

Även om många datatyper kan vara nycklar i dictionaries så kan inte alla vara det. Om man till exempel försöker skapa en dictionary med en lista som nyckel kommer python att klaga. Anledningen till detta är att det inte går att beräkna något hashvärde för listor. För den här kursen räcker det med att veta att de datatyper som är muterbara (se nästa kapitel) kan vara nycklar och att de som är immuterbara inte kan vara det.


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2019-08-16