Zanurkuj w Pythonie/Listy
Listy
edytujLista to zmienna zawierająca zbiór elementów. Elementami listy mogą być wszystkie dostępne w Python typy danych. Listy są jednym z najczęściej używanych typów danych. Można je porównać z tablicami (PHP, Perl) lub matrycami.
Listy przypominają tablice w Perlu. W Perlu zmienna, która przechowuje listę rozpoczyna się od znaku @ , natomiast w Pythonie nazwa może być dowolna, ponieważ Python automatycznie rozpoznaje typ.
|
Listy w Pythonie to coś więcej niż tablice w Javie (chociaż można to traktować jako jedno). Lepszą analogią jest klasa ArrayList , w której można przechowywać dowolny obiekt i dynamicznie dodawać nowe pozycje.
|
Definiowanie list
edytujPrzykład. Definiowanie list
>>> li = ["a", "b", "mpilgrim", "z", "przykład"] #(1) >>> li ['a', 'b', 'mpilgrim', 'z', 'przykład'] >>> li[0] #(2) 'a' >>> li[4] #(3) 'przykład'
- Najpierw zdefiniowaliśmy listę pięcioelementową. Zauważmy, że lista zachowuje swój oryginalny porządek i nie jest to przypadkowe. Lista jest uporządkowanym zbiorem elementów ograniczonym nawiasem kwadratowym.
- Lista może być używana tak jak tablica zaczynająca się od 0. Pierwszym elementem niepustej listy o nazwie
li
jest zawszeli[0]
. - Ostatnim elementem pięcioelementowej listy jest
li[4]
, ponieważ indeksy są liczone zawsze od 0.
Przykład. Ujemne indeksy w listach
>>> li ['a', 'b', 'mpilgrim', 'z', 'przykład'] >>> li[-1] #(1) 'przykład' >>> li[-3] #(2) 'mpilgrim'
- Za pomocą ujemnych indeksów odnosimy się do elementów idących od końca do początku tzn.
li[-1]
oznacza ostatni element,li[-2]
przedostatni,li[-3]
odnosi się do 3 od końca elementu itd. Ostatnim elementem niepustej listy jest zawszeli[-1]
. - Jeśli ciężko ci zrozumieć o co w tym wszystkim chodzi, możesz pomyśleć o tym w ten sposób:
li[-n] == li[len(li) - n]
.len
to funkcja zwracająca ilość elementów listy. Tak więc w tym przypadkuli[-3] == li[5 - 3] == li[2]
.
Przykład. Wycinanie list
>>> li ['a', 'b', 'mpilgrim', 'z', 'przyklad'] >>> li[1:3] #(1) ['b', 'mpilgrim'] >>> li[1:-1] #(2) ['b', 'mpilgrim', 'z'] >>> li[0:3] #(3) ['a', 'b', 'mpilgrim']
- Możesz pobrać podzbiór listy, który jest nazywany "wycinkiem" (ang. slice), poprzez określenie dwóch indeksów. Zwracaną wartością jest nowa lista zawierająca wszystkie elementy z listy rozpoczynające się od pierwszego wskazywanego indeksu (w tym przypadku
li[1]
) i idąc w górę kończy na drugim wskazywanym indeksie, nie dołączając go (w tym przypadkuli[3]
). Kolejność elementów względem wcześniejszej listy jest także zachowana. - Możemy także podać ujemną wartość któregoś indeksu. Wycinanie wtedy także dobrze zadziała. Jeśli to pomoże, możemy pomyśleć tak: czytamy listę od lewej do prawej, pierwszy indeks określa pierwszy potrzebny element, a drugi określa element, którego nie chcemy. Zwracana wartość zawiera wszystko między tymi dwoma przedziałami.
- Listy są indeksowane od zera tzn. w tym przypadku
li[0:3]
zwraca pierwsze trzy elementy listy, rozpoczynając odli[0]
, a kończąc nali[2]
, ale nie dołączającli[3]
.
Przykład. Skróty w wycinaniu
>>> li ['a', 'b', 'mpilgrim', 'z', 'przykład'] >>> li[:3] #(1) ['a', 'b', 'mpilgrim'] >>> li[3:] #(2) (3) ['z', 'przykład'] >>> li[:] #(2) (4) ['a', 'b', 'mpilgrim', 'z', 'przykład']
- Jeśli lewy indeks wynosi
0
, możemy go opuścić, wartość0
jest domyślna.li[:3]
jest tym samym, coli[0:3]
z poprzedniego przykładu. - Podobnie, jeśli prawy indeks jest długością listy, możemy go pominąć. Tak więc
li[3:]
jest tym samym, coli[3:5]
, ponieważ lista ta posiada pięć elementów. - Zauważmy pewną symetryczność: w pięcioelementowej liście
li[:3]
zwraca pierwsze 3 elementy, ali[3:]
zwraca dwa ostatnie (a w sumie 3 + 2 = 5). W ogólnym przypadkuli[:n]
będzie zwracał zawsze pierwszen
elementów (a jeślin
bedzie większe od ilości elementów w liście to tyle, ile ma lista), ali[n:]
pozostałą liczbę, bez względu na wielkość listy (n
może być większe od ilości elementów w liście). - Jeśli obydwa indeksy zostaną pominięte, wszystkie elementy zostaną dołączone. Nie jest to jednak to samo, co oryginalna lista
li
. Jest to nowa lista, która posiada wszystkie takie same elementy. li[:] tworzy po prostu kompletną kopię listy.
Dodawanie elementów do listy
edytujPrzykład. Dodawanie elementów do listy
>>> li ['a', 'b', 'mpilgrim', 'z', 'przykład'] >>> li.append("nowy") #(1) >>> li ['a', 'b', 'mpilgrim', 'z', 'przykład', 'nowy'] >>> li.insert(2, "nowy") #(2) >>> li ['a', 'b', 'nowy', 'mpilgrim', 'z', 'przykład', 'nowy'] >>> li.extend(["dwa", "elementy"]) #(3) >>> li ['a', 'b', 'nowy', 'mpilgrim', 'z', 'przykład', 'nowy', 'dwa', 'elementy']
- Dodajemy pojedynczy element do końca listy za pomocą metody
append
. - Za pomocą
insert
wstawiamy pojedynczy element do listy. Numeryczny argument jest indeksem, pod którym ma się znaleźć wstawiana wartość; reszta elementów, która znajdowała się pod tym indeksem lub miała większy indeks, zostanie przesunięta o jeden indeks dalej. Zauważmy, że elementy w liście nie muszą być unikalne i mogą się powtarzać; w przykładzie mamy dwa oddzielne elementy z wartością'nowy'
--li[2]
i li[6]. - Za pomocą
extend
łączymy listę z inną listą. Nie możemy wywołaćextend
z wieloma argumentami, trzeba ją wywoływać z pojedynczym argumentem -- listą. W tym przypadku ta lista ma dwa elementy.
Przykład. Różnice między
extend
a append
>>> li = ['a', 'b', 'c'] >>> li.extend(['d', 'e', 'f']) #(1) >>> li ['a', 'b', 'c', 'd', 'e', 'f'] >>> len(li) #(2) 6 >>> li[-1] 'f' >>> li = ['a', 'b', 'c'] >>> li.append(['d', 'e', 'f']) #(3) >>> li ['a', 'b', 'c', ['d', 'e', 'f']] >>> len(li) #(4) 4 >>> li[-1] ['d', 'e', 'f']
- Listy posiadają dwie metody --
extend
iappend
, które wyglądają na to samo, ale w rzeczywistości są całkowicie różne.extend
wymaga jednego argumentu, który musi być listą i dodaje każdy element z tej listy do oryginalnej listy. - Rozpoczęliśmy z listą trójelementową (
'a'
,'b'
i'c'
) i rozszerzyliśmy ją o inne trzy elementy ('d'
,'e'
i'f'
) za pomocąextend
, tak więc mamy już sześć elementów. append
wymaga jednego argumentu, który może być dowolnym typem danych. Metoda ta po prostu dodaje dany element na koniec listy. Wywołaliśmyappend
z jednym argumentem, który jest listą z trzema elementami.- Teraz oryginalna lista, pierwotnie zawierająca trzy elementy, zawiera ich cztery. Dlaczego cztery? Ponieważ ostatni element przed chwilą do niej wstawiliśmy. Listy mogą wewnątrz przechowywać dowolny typ danych, nawet inne listy. Nie używajmy
append
, jeśli zamierzamy listę rozszerzyć o kilka elementów.
Przeszukiwanie list
edytujPrzykład. Przeszukiwanie list
>>> li ['a', 'b', 'nowy', 'mpilgrim', 'z', 'przykład', 'nowy', 'dwa', 'elementy'] >>> li.index("przykład") #(1) 5 >>> li.index("nowy") #(2) 2 >>> li.index("c") #(3) Traceback (most recent call last): File "<stdin>", line 1, in ? ValueError: list.index(x): x not in list >>> "c" in li #(4) False
index
znajduje pierwsze wystąpienie pewnej wartości w liście i zwraca jej indeks.index
znajduje pierwsze wystąpienie wartości w liście. W tym przykładzie,'nowy'
występuje dwa razy -- wli[2]
i li[6], ale metodaindex
będzie zawsze zwracać pierwszy indeks, czyli2
.- Jeśli wartość nie zostanie znaleziona, Python zgłosi wyjątek. Takie zachowanie nie jest często spotykane w innych językach, w wielu językach w takich przypadkach zostaje zwrócony niepoprawny indeks. Taka reakcja Pythona jest dobrym zachowaniem, ponieważ umożliwia szybkie wychwycenie błędu w kodzie, a dzięki temu program nie będzie błędnie działał operując na niewłaściwym indeksie.
- Aby sprawdzić czy jakaś wartość jest w liście używamy słowa kluczowego
in
, który zwracaTrue
, jeśli wartość zostanie znaleziona lubFalse
jeśli nie.
Przed wersją 2.2.1 Python nie posiadał oddzielnego boolowskiego typu danych. Aby to zrekompensować, Python mógł interpretować większość typów danych jako bool (czyli wartość logiczną np. w instrukcjach if ) według poniższego schematu:
|
Wszystkie powyższe punkty stosowane są w Pythonie 2.2.1 i nowszych, ale obecnie można także używać typu logicznego bool
, który może przyjmować wartość True
(prawda) lub False
(fałsz). Zwróćmy uwagę, że wartości te, tak jak cała składnia języka Python, są wrażliwe na wielkość liter.
Usuwanie elementów z listy
edytujPrzykład. Usuwanie elementów z listy
>>> li ['a', 'b', 'nowy', 'mpilgrim', 'z', 'przykład', 'nowy', 'dwa', 'elementy'] >>> li.remove("z") #(1) >>> li ['a', 'b', 'nowy', 'mpilgrim', 'przykład', 'nowy', 'dwa', 'elementy'] >>> li.remove("nowy") #(2) >>> li ['a', 'b', 'mpilgrim', 'przykład', 'nowy', 'dwa', 'elementy'] >>> li.remove("c") #(3) Traceback (most recent call last): File "<stdin>", line 1, in ? ValueError: list.remove(x): x not in list >>> li.pop() #(4) 'elementy' >>> li ['a', 'b', 'mpilgrim', 'przykład', 'nowy', 'dwa']
remove
usuwa pierwszą występującą wartość w liście.remove
usuwa tylko pierwszą występującą wartość. W tym przypadku'nowy'
występuje dwa razy, aleli.remove("nowy")
usuwa tylko pierwsze wystąpienie.- Jeśli wartość nie zostanie znaleziona w liście, Python wygeneruje wyjątek. Naśladuje on w takich sytuacjach postępowanie metody
index
. pop
jest ciekawą metodą, która wykonuje dwie rzeczy: usuwa ostatni element z listy i zwraca jego wartość. Metoda ta różni się odli[-1]
tym, żeli[-1]
zwraca jedynie wartość, ale nie zmienia listy, a odli.remove(value)
tym, żeli.remove(value)
zmienia listę, ale nie zwraca wartości.
Używanie operatorów na listach
edytujPrzykład. Operatory na listach
>>> li = ['a', 'b', 'mpilgrim'] >>> li = li + ['przykład', 'nowy'] #(1) >>> li ['a', 'b', 'mpilgrim', 'przykład', 'nowy'] >>> li += ['dwa'] #(2) >>> li ['a', 'b', 'mpilgrim', 'przykład', 'nowy', 'dwa'] >>> li = [1, 2] * 3 #(3) >>> li [1, 2, 1, 2, 1, 2]
- Aby połączyć dwie listy, można też skorzystać z operatora
+
. Za pomocąlista = lista + innalista
uzyskujemy ten sam wynik, co za pomocąlist.extend(innalista)
, ale operator+
zwraca nową listę, podczas gdyextend
zmienia tylko istniejącą listę. Ogólnieextend
jest szybszy, szczególnie na dużych listach. - Python posiada także operator
+=
. Operacjali += ['dwa']
jest równoważnali.extend(['dwa'])
. Operator+=
działa zarówno na listach, łańcuchach znaków jak i może być nadpisany dla dowolnego innego typu danych. - Operator
*
zwielokrotnia podaną listę.li = [1, 2] * 3
jest równoważne zli = [1, 2] + [1, 2] + [1, 2]
, które łączy trzy listy w jedną.
Materiały dodatkowe
edytuj- How to Think Like a Computer Scientist uczy podstaw związanych z wykorzystywaniem list, a także nawiązuje do przekazywania listy jako argument funkcji.
- Python Tutorial pokazuje, że listy można wykorzystywać jako stos lub kolejkę.
- Python Knowledge Base odpowiada na często zadawane pytania dotyczące list, a także posiada także wiele przykładów kodów źródłowych wykorzystujących listy.
- Dokumentacja wszystkich metod, które zawiera klasa lista.