2024-06-11

Myśląc o Pythonie: Operacje na listach

Dziś kontynuujemy temat list w pythonie. Mówiliśmy sobie, że są to bardzo elastyczne i pożyteczne struktury. Mogą przechowywać kilka typów na raz. Co więcej, możemy nawet tworzyć listy w listach. Natomiast kontynuując zagadnienie to, będziemy dziś wykonywać jakieś przykładowe, na nich, operacje.

Możemy sobie stworzyć podstawową listę i wskazać, że zmienna przykładowo my_list będzie referencją (będzie wskazywać) do tej listy. Do listy natomiast włożymy sobie na razie liczby całkowite, czyli typu int. Stwórzmy sobie taką przykładową listę zatem i ją wyświetlmy.

Jak widzimy, nic nadzwyczajnego. Ot, tworzymy sobie listę, wypełniamy ją zwykłymi liczbami i następnie wyświetlamy ją używając funkcji print, której przekazujemy oczywiście zmienną wskazującą na listę.

Możemy oczywiście, zamiast tak po barbarzyńsku wyświetlać (lub "wyprintowywać") wyświetlać sobie naszą listę za pomocą print. - wykonać trochę inne operacje na listach i przetworzyć ją w pętli. Wiemy już jak przetwarzać listę w pętli, najlepiej użyć do tego pętli for, która pozwoli nam w bardzo wygodny sposób wyświetlić każdą z wartości osobno.

Oczywiście jak się spodziewaliśmy każda wartość z listy została wyświetlona o osobnym wierszu. Można by pokusić się o wyświetlenie wartości w jednym wierszu dodając drugi argument w print o nazwie 'end'. Wtedy na końcu wiersza, zamiast domyślnego znaku nowej linii, może zostać przykładowo wstawiona spacja. Sytuację taką mamy poniżej.

Operacje na listach z błędem out of range

Jeżeli jako piszący kod programista zapomnimy się troszkę i wyjdziemy poza listę. Odwołując się do wartości która nie istnieje, to dostaniemy po łapkach. Przykładowo, w naszej liście mamy cztery elementy, które oczywiście numerujemy od zera. Mamy zatem wartości indeksów od zera do trzy (bo n-1). Jeśli teraz odwołamy się do indeksu o numerku o jeden większym niż ostatni indeks w naszej liście, jak poniżej

błąd out of index w Pythonie

To w takim wypadku dostaniemy komunikat nie tylko o tym, gdzie jest błąd. Prócz tego, że interpreter pokaże nam ładnie w jakim pliku i jakiej linii jest błąd, to powie nam jaki to błąd. Jest to, jak widać, błąd IndexError: list index out of range. Mówi nam to tyle, że indeks listy jest poza zasięgiem, innymi słowy chcieliśmy się odwołać do elementu listy, który nie należy do tej listy.

Oczywiście gdy chcemy się odwołać do elementu spoza listy oczywisty jest protest naszego interpretera, bo taka operacja na listach nie jest możliwa. Nie jest możliwa z jednego prostego powodu, taki element po prostu nie istnieje. Jako, że w naszej liście mamy cztery elementy to, mimo tego, że mamy w indexie cyfrę 4, nie istnieje w tej liście element piąty w kolejności.

No dobrze, wiemy już gdzie nie wychodzić z naszym swawolnym odwoływaniem się do elementów listy - nie wychodzić poza zakres. Natomiast co jeszcze możemy zrobić prócz takiego odwoływania się do poszczególnych elementów. Otóż operacji na listach jest oczywiście trochę więcej.

Metody operujące na listach

Operacje na listach wykonują oczywiście też metody, czyli takie funkcje obiektów (o obiektach kiedyś powiemy sobie). W Pythonie wszystko jest obiektem, czyli listy także nim są. Zatem po nazwie naszej listy możemy sobie postawić kropkę, która niejako pozwala nam "wejść do obiektu". Innymi słowy po kropce możemy zobaczyć między innymi, różne metody jakie są w naszej liście. I jakie możemy na niej zastosować.

Dodawanie elementów do listy

Do naszej listy możemy dodać element stosując właśnie operator kropki, po którym następuje nazwa metody dodającej elementy do listy. Mamy tutaj taką metodę jak append() - pozwoli nam ona po prostu dokleić element na końcu listy. Pokazano taką sytuację poniżej.

dodawanie elementu do listy w Pythonie

Jak możemy sobaczyć, jako wynik działania skryptu, dostajemy dwa razy wyprintowaną zawartość tablicy. Funkcja print jest tutaj użyta dwukrotnie, przed zastosowaniem metody append na naszej tablicy i po tym zastosowaniu, aby uwidocznić różnicę. Różnica jest widoczna natomiast na pierwszy rzut oka - mamy nową wartość (typu int) w naszej tablicy.

Zatem widzimy, że metoda append, wywołana na naszej liście jest po prostu metoda która "dokleja" podaną jej, jako argument, wartość. Tylko tyle i aż tyle 😉

Jeszcze jedna kwestia tutaj, bo mogłoby komuś przyjść do głowy, że jeśli odwołujemy się do elementu który nie istnieje, to jeśli przypiszemy do nieistniejącego elementu nową wartość to interpreter sam zrozumie, że należy takowy element utworzyć.

błąd kiedy próbujemy dodać element za pomocą nieistniejącego indeksu do list w Pytonie

Nie jest to niestety prawdą. W takim przypadku otrzymamy także błąd out of range. Po to dano nam metodę append, by jej używać do dodawania elementów. Używajmy więc do dodawania elementów do list metody append, to nic się nam nie stanie - nie kombinujmy tutaj.

Odwracanie listy

Gdyby ktoś chciał, to listę można także odwrócić. Myślę, że intuicyjnie to rozumiemy - jest to po prostu zrobienie tak, by elementy w liście były ułożone od ostatniego do pierwszego. Używamy do tego metody (a jakże!) o nazwie reverse, co po angielsku znaczy "odwróć" lub "odwrotność". Jednym słowem (dosłownie) mówimy interpreterowi by odwrócił to na czym stosujemy metodę (czyli naszą listę). Zobaczmy to w praktyce.

odwracanie listy w Pythonie

Tutaj także użyłem dwa razy funkcji print - dla lepszego zobrazowania. I co to nam obrazuje? Wszystko to o czym sobie w poprzednim akapicie powiedzieliśmy. Mieliśmy listę, która zawierała elementy od 10 do 40, co 10, od najmniejszego do największego. Teraz nasza lista zawiera to samo, ale od największego do najmniejszego. Po prostu odwróciliśmy kolejność elementów naszą operacją na liście przy użyciu metody reverse. Właśnie tego się spodziewaliśmy.

Listę mamy teoretycznie też posortowaną, ale te sortowanie wynika tylko i wyłącznie z tego, że wartości wstawiliśmy do listy ręcznie i to po kolei. Zatem wartości na początku już były posortowane, teraz po prostu mają odwróconą kolejność, więc i sortowanie uległo niejako "odwróceniu".

Metoda sortująca elementy

No i jak teraz użyć 'prawdziwego' sortowania? W sensie takiego, które posortuje nam tablicę, a nie odwróci kolejność elementów, które są ustawione rosnąco po kolei. Żeby to zrobić to najpierw dodamy sobie do tablicy kilka losowych wartości, żebyśmy lepiej zobaczyli efekty naszych działań.

Wstawiłem kilka losowych wartości do tablicy. Zrobiłem to przy użyciu pętli for i teraz mamy nieuporządkowane elementy w tablicy. Możemy wreszcie pokazać sobie kolejną metodę jaką dziś poznamy, czyli metodę sort().

Powyżej widzimy, że tym razem nasza lista zachowała się znowu tak jak oczekiwaliśmy czyli została posortowana. Zatem metoda sort, zastosowana na liście, może ją posortować. Finalnie nasza 'nieuczesana' lista została uczesana metodą sort, która ją posortowała rosnąco, czyli od najmniejszej wartości w liście, do największej. Jak posortować inaczej? O tym możesz poszukać na zadanie domowe, albo poczekać aż zdradzę Ci tę tajemnicę w przyszłości 😉

Na koniec jeszcze jedna, ważna (a jak) kwestia. Pokazane metody modyfikują nam naszą wspaniałą oryginalną listę. Mówiliśmy o tym, że listy są mutowalne, czyli modyfikowalne. Za pomocą naszych metod wykonaliśmy na liście szereg mutacji, przekształceń. Jedną listę początkową, przekształciliśmy i na końcu mamy listę, która wygląda zupełnie inaczej. To ważny koncept, bo operacje na listach nie muszą modyfikować oryginału listy, mogą tworzyć nową listę (jak w tuplach). Powiemy sobie więcej w przyszłości o tych kwestiach 😉 Na razie tutaj zakończymy nasze operacje na listach.

2 comments on “Myśląc o Pythonie: Operacje na listach”

Dodaj komentarz

linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram