Dziś kontynuujemy operacje na listach. Pomówimy sobie o tym co jeszcze możemy z taką listą zrobić i jakich operacji i metod możemy użyć względem listy. Jak wspomnieliśmy, listy w Pythonie są bardzo elastycznym typem danych. Dotychczas już robiliśmy kilka fajnych rzeczy z listami: odwracaliśmy je, sortowaliśmy, dodawaliśmy elementy do listy. Dziś, m.in. poznamy tzw. slicing.
Lista będąc tak wszechstronną i szeroko używaną konstrukcją w Pythonie, pozwala na dość wiele, ale zanim sobie powiemy o tym, zacznijmy po prostu od omówienia naszej początkowej listy, a zawiera ona ponownie elementy liczbowe. Są to liczby od 10 do 40, każda kolejna jest o 10 większa od poprzedniej. Mamy zatem taką oto listę:

Na razie nic skomplikowanego. Oczywiście umiesz już wyświetlić taką listę i znasz kilka podstawowych operacji, które możesz na niej wykonać (jeśli nie to zapraszam tutaj). Zatem zobaczymy jak będzie ona wyglądać w terminalu.

Oczywiście widzimy to czego mogliśmy się spodziewać, czyli naszą listę w całej okazałości 😉 Zawiera ona wspomniane elementy, a wyświetlenie jej za pomocą print() prezentuje jej zawartość w nawiasach. Przejdźmy teraz do czegoś ciekaweszego.
Wycinanie listy
Wspomniany w pierwszym akapicie slicing to, jak można się domyślać, to wycinanie - albo inaczej cięcie na plasterki (slice - plasterek). Polega to na wycięciu, za pomocą specjalnej składni, interesujących nas elementów listy. W praktyce sprowadza się to do wstawienia nawiasów prostokątnych po nazwie listy, a w nich umieszczamy zakres elementów do wycięcia. Mamy tutaj pewne podobieństwo do odwoływania się do konkretnego indeksu listy.
Konkretniej rzecz ujmując, w nawiasach po nazwie listy podajemy zakres w postaci, cyfry symbolizującej index elementu listy, od którego zaczynamy. Po nim wstawiamy dwukropek, a po dwukropku piszemy cyfrę oznaczającą liczbę elementów jakie chcemy wyciąć.

Jak możemy zauważyć poniżej, nasza lista została skrócona do dwu elementów, to właśnie dzięki temu, że napisaliśmy cyfrę dwa po dwukropku. Dlaczego elementy o wartościach 10 i 20 akurat? No, jak się pewnie domyślacie, właśnie dlatego, że przed dwukropkiem stoi cyfra zero, co oznacza, że zaczynamy od elementu o indeksie właśnie zero, który ma wartość właśnie 10. Zaczynając zatem od elementu o indeksie 0, wycinamy następnie dwa elementy. Czyli element o indeksie zero i taki o indeksie jeden. Zatem finalnie mamy dwa wycięte elementy, o indeksach zero i jeden, a ich wartości to 10 i 20. Dlatego właśnie widzimy na ekranie liczby 10 i 20.
Slicing bez podawania jednej z danych
Możemy oczywiście manipulować zakresem dowolnie - zacząć od środka listy, czy też nie wpisać nic jako pierwszą wartość. Domyślnie Python zacznie od początku listy. Zatem jeśli zostawilibyśmy po dwukropku cyfrę dwa, ale przed nim nie wpisali nic, to efekt nie powinien ulec zmianie.

Na obrazku widzimy, że pomimo pominięcia pierwszej z wartości w nawiasie kwadratowym, po nazwie listy - slicing dalej działa. Co więcej efekt jest taki jakbyśmy wpisali przed dwukropkiem zero. Właśnie dlatego, że jeśli nie podamy wartości to Python zacznie od początku listy, czyli od indeksu zero. Odwrotnie, jeśli nie podamy liczby elementów do wycięcia - czyli cyfry po dwukropku - analogicznie Python zakończy dopiero wraz z końcem listy. Zatem jeśli usuniemy także naszą cyfrę dwa, otrzymamy całą listę.

Myślę, że powyższa grafika nie wymaga już komentarza, dla treningu możemy jeszcze sobie wpisać przed dwukropkiem cyfrę dwa co będzie oznaczało rozpoczęcie wycinania od elementu o indeksie dwa, czyli trzeciego elementu listy.

Powyżej otrzymaliśmy drugą połowę naszej listy. Właśnie dzięki tej dwójce wpisanej przed dwukropkiem tak to działa. Mamy tutaj wzięty jako pierwszy element, element stojący na indeksie dwa, a wycinamy do końca tablicy.
Zatem slicing działa od wspomnianego elementu, aż do końca. Dlatego elementy mamy dwa, bo po indeksie o numerku 2 jest tylko indeks o numerku 3.
Slicing może być też wykorzystywany na innym typie danych. Typ tekstowy bowiem, bo o nim mowa, również jest listą. Jest to lista znaków, zatem także możemy używać w jego przypadku przedstawionej składni. Mamy zatem różne typy, ale jedną i tą samą składnię, co jest bardzo korzystne 😉 Pomówmy zatem jakie jeszcze mamy operacje na listach.
Listy jak liczby
Operacje na listach, to dużo innych możliwości. Lista jest zbiorem wartości, na którym, co może być zaskakujące, możemy wykonywać działania matematyczne. Oczywiście nie wszystkie, ale możemy listy przykładowo dodawać. Na listach też można wykonywać mnożenie. Czyli podstawowe operatory arytmetyczne też mogą być stosowane do pracy z listami. Spójrzmy na przykład:

Przykładowo możemy sobie stworzyć dwie listy i spróbować je dodać, tak jak powyżej. W wyniku dodania, powinniśmy po prostu otrzymać jedną listę składającą się z połączenia tych dwu. Sprawdźmy zatem co pokaże nam funkcja print.

Jeśli dopiszemy do naszego kodu linijkę wyświetlającą naszą main_list. To otrzymamy listę, która powstała z dodanie my_list i my_list2, to jak widać, otrzymamy jedną wielką listę. Będzie ona zawierać elementy zarówno z jeden, jak i drugiej z połączonych list.
Mamy też możliwość dopisania jeszcze dodatkowo mnożenia do naszego działania na listach, co powinno pomnożyć nam drugą, z dodawanych list. Zobaczmy zatem czy tak się stanie.

Jak widzimy dopisaliśmy w naszym kodzie Pythona mnożenie. Teraz dodajemy nasze listy, ale drugą z nich jeszcze mnożymy przez dwa. W wyniku otrzymujemy jedną dużą listę. Lista ta zawiera wszystkie elementy list na nią się składających, ale zawiera też dwa razy elementy listy my_list2. Dzieje się właśnie z powodu naszej zmiany. Dodajemy po prostu listę drugą, ale po tym jak już zdublowano jej elementy.
Inne działania na listach
Jeśli chodzi o inne operacje na listach. Do list można stosować dużą część standardowych funkcji, przykładowo funkcje sprawdzające, takie jak len. Funkcja ta sprawdza długość danego jej łańcucha znaków, ale można ją też zastosować do naszej listy. Dostaniemy wtedy wielkość / długość listy.

Gdy dopiszemy w naszym wyświetlający listę princie, wywołanie funkcji len, wraz z wynikową listą jako argument. Otrzymamy wartość 8, która będzie ilością elementów w liście. I, ku zdziwieniu tłumu, właśnie tyle elementów zawiera nasze utworzona wcześniej lista.
W odniesieniu do list w Pythonie, możemy także użyć operatorów takich jak in i not in. Operatory te pomogą nam stwierdzić czy coś zawiera się w liście lub nie, a odpowiedzią będzie logiczne true lub false.

Jeśli naszym princie umieścimy konstrukcje mającą odpowiedzieć na pytanie. Pytanie natomiast będzie brzmiało czy w liście main_list zawiera się liczba 10. W takim wypadku w odpowiedzi dostaniemy True, bo jeden z elementów listy to właśnie 10. Gdybyśmy użyli operatora not in to pytanie brzmiałoby czy liczba 10 nie znajduje się na liście.

Odpowiedź na tak postawione pytanie, w tym wypadku, jest oczywiście przecząca. Bowiem na naszej liście znajduje się liczba 10, zatem nie możemy potwierdzić, że się ona tam nie znajduje. Otrzymujemy zatem wartość logiczną False.

[…] to zaczynając od elementu o jeden późniejszego od wcześniejszej pętli. Tutaj dzięki użyciu slicingu, uzyskamy elementy od indeksu listy a +1 do samego końca listy. No i tutaj dochodzimy do mmentu […]