TI/Programowanie dla Fizyków Medycznych:Struktury danych:Krotki

Z Brain-wiki

Krotka to niemodyfikowalna sekwencja. Krotki są bardzo podobne do list, jednak krotki, które nie zawierają elementów modyfikowalnych mogą być kluczami w słownikach, co jest znaczącą zaletą.

Krotki można tworzyć wprost, przez podanie elementów oddzielonych przecinkami (nawiasy są opcjonalne):

>>> K = ('Ala', 5, [1, 7], (2, 'A'), {'a' : 'b', (1, 3) : 'c'}) #Ta krotka nie może być kluczem w słowniku bo zawiera struktury modyfikowalne : listę i słownik
>>> L = 'Ala', 5, [1, 7], (2, 'A'), {'a' : 'b', (1, 3) : 'c'}
>>> K == L
True

Pustą krotkę tworzy się następująco:

>>> K = ()
>>> K = tuple()

Za to krotkę jednoelementową tworzy się dość nieintuicyjnie - wymagany jest przecinek po elemencie aby odróżnić krotkę od onawiasowanej wartości:

>>> K = (5) #Teraz K jest liczbą 5, a nie jednoelementową krotką zawierającą liczbę 5
>>> K
5
>>> K= (5,) #Dopiero to jest jednoelementowa krotka
>>> K
(5,)
>>> K = 5,
>>> K
(5,)

Krotki można też tworzyć na bazie dowolnego obiektu po którym można się iterować przy pomocy funkcji wbudowanej tuple:

>>> K = tuple({'a' : 1, 'b' : 2}.iteritems())
>>> K
(('a', 1), ('b', 2))

Elementy krotki można przypisać na zmienne:

>>> K = (1, 2, 3)
>>> a, b, c = K
>>> a
1
>>> b
2
>>> c
3

Elementy krotek odczytujemy przy pomocy indeksów lub wycinków, dodawanie krotek tworzy nową krotkę będącą konkatenacją pierwotnych, a mnożenie prze liczbę tworzy krotkę będącą wielokrotną konkatenacją krotki bazowej. Podobnie jak w przypadku napisów i list krotki można przeglądać przy pomocy pętli for i posyłać do funkcji reduce, map i filter. Krotki udostępniają metody index i count działające analogicznie jak w przypadku list. W przypadku krotek możliwe są też porównania operatorami <=, <, >, >=, == i !=, a także testowanie czy element jest w krotce operatorem in i sprawdzanie długości funkcją len. Różnica występuje przy tworzeniu krotek składanych, analogiczna jak w przypadku list konstrukcja zwraca generator i aby uzyskać krotkę konieczne jest wywołanie tuple:

>>> K = (1, 2, 3)
>>> (x**2 for x in K)
<generator object <genexpr> at 0xb658f9dc>
>>> tuple((x**2 for x in K))
(1, 4, 9)