Python i tablice a nawet listy
Tablice danych listami zwane w Pythonie przedstawiłem już wcześniej w ich specyficznej formie (stringi w Pythonie).
Ale jak to większość rzeczy w Pythonie – nie zawsze jest tak jak nam się wydaje. Zwłaszcza jak już się zna inne popularne języki;)
W średniowiecznych językach programowania można było spotkać tzw. tablice (arrays) – coś jak wspomniany wyżej string – zbiór elementów tego samego typu. Takie tam jak w C, C++ czy Pascalu. I w Pythonie też można ich używać – o czym kiedyś napiszę w osobnym artykule – jednak dzisiaj skupimy się na listach – takim bazowym odpowiednikiem tablic.
Listy w Pythonie – podstawy
Listy są w pewnym sensie podobne do wspomnianych wyżej tablic – najważniejszą różnicą chyba będzie to, że są dynamiczne oraz mogą zawierać elementy różnego typu. Najłatwiej chyba będzie objaśnić to na przykładach. Zacznijmy od inicjalizacji list:
>>> tablica = []
>>> tablica.append('pierwszy obiekt')
>>> tablica.append('drugi obiekt')
>>> tablica.append(3)
>>> tablica.append(4)
>>> tablica.append("pięć")
>>> print(tablica)
['pierwszy obiekt', 'drugi obiekt', 3, 4, 'pięć']
Za pomocą append() możemy dodawać elementy do listy w każdym momencie.
Można też od razu zainicjować listę wartościami:
>>> lista = ['pierwszy obiekt','drugi obiekt',3,4,'pięć']
>>> print(lista)
['pierwszy obiekt', 'drugi obiekt', 3, 4, 'pięć']
Indeksy
Odwoływanie się do poszczególnych komórek wygląda podobnie jak w stringach – pierwszy indeks ma numer 0. Ostatni element listy ma indeks n-1, gdzie n to ilość elementów listy. Działają tutaj też indeksy wsteczne – czyli przeskakujemy na koniec listy w przypadku zejścia poniżej zera – ostatnie dwa przykłady w kodzie poniżej.
>>> lista = ['pierwszy obiekt','drugi obiekt',3.5,4,'pięć']
>>> print(lista)
['pierwszy obiekt', 'drugi obiekt', 3.5, 4, 'pięć']
>>> print(lista[0])
pierwszy obiekt
>>> print(lista[4])
pięć
>>> print(lista[-1])
pięć
>>> print(lista[-2])
4
Dla przypomnienia jeszcze wkleję ponownie obrazek z wpisu o łańcuchach – czerwonym indeksy zwykłe, niebieskim indeksy wsteczne:

Wartość elementu listy możemy przypisując do niego nową wartość:
>>> lista = [1, 2, 3, 4, 5]
>>> print(lista)
[1, 2, 3, 4, 5]
>>> lista[2] = 42
>>> print(lista)
[1, 2, 42, 4, 5]
Wycinanie list (slicing)
Listy możemy wycinać podobnie jak łańcuchy znaków. Dla przypomnienia w kwadratowych nawiasach podajemy zakres do wycięcia – oddzielone dwukropkiem od-do i opcjonalnie trzecia wartość skok. Będzie to dobrze widać na poniższych przykładach:
>>> lista = ['pierwszy obiekt','drugi obiekt',3.5,4,'pięć']
# tak drukujemy wyciętą ale całą listę
>>> print(lista[:])
['pierwszy obiekt', 'drugi obiekt', 3.5, 4, 'pięć']
# zaczynamy po drugim obiekcie do końca
>>> print(lista[2:])
[3.5, 4, 'pięć']
# wycinamy to, co przed trzecim elementem
>>> print(lista[:2])
['pierwszy obiekt', 'drugi obiekt']
# zaczynamy cięcie po drugim aż do czwartego
>>> print(lista[2:4])
[3.5, 4]
# co drugi - trzeci parametr to 2
>>> print(lista[::2])
['pierwszy obiekt', 3.5, 'pięć']
# w odwrotnej kolejności - trzeci parametr to -1
>>> print(lista[::-1])
['pięć', 4, 3.5, 'drugi obiekt', 'pierwszy obiekt']
Inne operacje na tablicach
Listy możemy do siebie tak po prostu dodawać:
>>> ta = ['a','b','c']
>>> tb = ['a','b','c']
>>> tc = ta + tb
>>> print(tc)
['a', 'b', 'c', 'a', 'b', 'c']
>>> tc = tc + [1,2,3]
>>> print(tc)
['a', 'b', 'c', 'a', 'b', 'c', 1, 2, 3]
Podmieniać zawartości całych bloków elementów – podobnie jak slicing:
>>> lista = ['red','green','niebieski']
>>> print(lista)
['red', 'green', 'niebieski']
>>> lista[:2] = ['czerwony','zielony']
>>> print(lista)
['czerwony', 'zielony', 'niebieski']
Albo wyzerować listę:
>>> lista = ['red','green','niebieski']
>>> print(lista)
['red', 'green', 'niebieski']
>>> lista[:] = []
>>> print(lista)
[]
A gdzie się podziały tablice wielowymiarowe?
No właśnie… W Pythonie mamy coś takiego jak listy zagnieżdżone. Normalnie lista jest jednowymiarowa, jest jednym ciągiem elementów. A co gdybyśmy chcieli zapisać np. wynik potyczki w kółko i krzyżyk?
Zapisujemy poszczególne wiersze jako „listy w liście” – a indeksy podajemy [x][y] – gdzie x i y to wiersz i kolumna (tak jak wcześniej liczone od 0):
>>> wynik = [['o','o','x'],
>>> ['x','x','o'],
>>> ['o','x','x']]
# wyświetlamy całość
>>> print(wynik)
[['o', 'o', 'x'], ['x', 'x', 'o'], ['o', 'x', 'x']]
# wyświetlamy środkowy element
>>> print(wynik[1,1])
x
# wyświetlamy pierwszy element w ostatnim wierszu
>>> print(wynik[2][0])
o
Oczywiście jeżeli potrzebujemy więcej wymiarów, to możemy kolejne listy w listach zagnieździć:
>>> wynik = [[[0,0],[0,1],[0,2]],
>>> [[1,0],[1,1],[1,2]],
>>> [[2,0],[2,1],[2,2]]]
>>> print(wynik)
[[[0, 0], [0, 1], [0, 2]], [[1, 0], [1, 1], [1, 2]], [[2, 0], [2, 1], [2, 2]]]
# chcę wyświetlić z ostatniej listy, z pierwszego elementu, drugi jej element
>>> print(wynik[2][0][1])
0
Żeby bardziej zobrazować zrobiłem kolejną Pythonotkę 😉 Jak widać poniżej adresowanie zaczynamy od najwyższego poziomu zagnieżdżenia – coś jakbyśmy mieli x, y i dodatkowe z porównując do poprzedniego przykładu:

Warto jeszcze wspomnieć, że w przeciwieństwie np. do C++ zagnieżdżenia mogą być nieregularne. Na przykład:
>>> auta = ['Janek', ['Passat','Golf']]
>>> print(auta[1])
['Passat', 'Golf']
>>> print(auta[1][1])
Golf
I na koniec…
Obliczanie rozmiaru listy w Pythonie
Tutaj zaskoczenia być nie powinno, jeżeli przerabialiście już łańcuchy znaków. Rozmiar listy możemy poznać za pomocą funkcji len().
>>> lista = [1,2,3,4,5]
>>> len(lista)
5
W przypadku list zagnieżdżonych funkcja len() zwróci tylko ilość elementów z najwyższego poziomu zagnieżdżenia.
W następnym odcinku opowiadam o pętlach w Pythonie.