Python ma świetny wbudowany typ listy o nazwie „list”. Literały listy są ujęte w nawiasach kwadratowych [ ]. Listy działają podobnie jak ciągi znaków – do uzyskiwania dostępu do danych używaj funkcji len() i nawiasów kwadratowych [ ], przy czym pierwszy element ma indeks 0. (zapoznaj się z oficjalną dokumentacją listy python.org).
colors = ['red', 'blue', 'green'] print(colors[0]) ## red print(colors[2]) ## green print(len(colors)) ## 3
Przypisanie z = na listach nie powoduje utworzenia kopii. Zamiast tego przypisanie sprawia, że 2 zmienne wskazują w pamięci jedną listę.
b = colors ## Does not copy the list
„Pusta lista” to pusta para nawiasów kwadratowych [ ]. Znak „+” dodaje dwie listy, więc [1, 2] + [3, 4] daje [1, 2, 3, 4] (podobnie jak znak + z ciągami znaków).
FOR i IN
Konstrukcje *for* i *in* w Pythonie są bardzo przydatne. Pierwszym ich zastosowaniem, jakie zobaczymy, będzie użycie ich w przypadku list. Konstrukcja *for* (for var in list
) to łatwy sposób na sprawdzenie każdego elementu na liście (lub w innej kolekcji). Nie dodawaj ani nie usuwaj elementów z listy podczas iteracji.
squares = [1, 4, 9, 16] sum = 0 for num in squares: sum += num print(sum) ## 30
Jeśli wiesz, jakie dane znajdują się na liście, użyj w pętli nazwy zmiennej, która przechwytuje te informacje, np. „num”, „name” lub „url”. Ponieważ kod Pythona nie ma innej składni przypominającej o typach, nazwy zmiennych są kluczem do poprawnego interpretacji tego, co się dzieje. (To może być trochę mylące. W miarę poznawania Pythona będziesz napotykać wskazówki dotyczące typów, które umożliwiają dodawanie informacji o typach do definicji funkcji. Python nie korzysta z tych wskazówek przy uruchamianiu programów. Są one używane przez inne programy, takie jak IDE (zintegrowane środowiska programistyczne) i narzędzia do analizy statycznej, takie jak lintery lub sprawdzacze typów, aby sprawdzić, czy funkcje są wywoływane z kompatybilnymi argumentami.
Samodzielny konstruktor *in* to prosty sposób na sprawdzenie, czy element pojawia się na liście (lub w innym zbiorze) – value in collection
– sprawdza, czy wartość znajduje się w kolekcji i zwraca wartości Prawda/Fałsz.
list = ['larry', 'curly', 'moe'] if 'curly' in list: print('yay') ## yay
Konstrukcje for/in są bardzo często używane w kodzie Pythona i działają na typy danych inne niż lista, więc warto zapamiętać ich składnię. Możesz mieć nawyki z innych języków, w których ręcznie inicjujesz iterację kolekcji, podczas gdy w Pythonie powinieneś po prostu użyć for/in.
Możesz też użyć instrukcji for/in do pracy z ciągiem znaków. Ciąg znaków działa jak lista znaków, więc for ch in s: print(ch)
wypisuje wszystkie znaki w ciągu.
Zakres
Funkcja range(n) zwraca liczby 0, 1, ... n-1, a funkcja range(a, b) zwraca a, a+1, ... b-1 – do ostatniej liczby włącznie. Połączenie funkcji for-loop i range() pozwala utworzyć tradycyjną liczbową pętlę:
## print the numbers from 0 through 99 for i in range(100): print(i)
Istnieje wariant xrange(), który pozwala uniknąć kosztów tworzenia całej listy w przypadkach, w których liczy się wydajność (w Pythonie 3 funkcja range() będzie miała dobrą wydajność, więc możesz zapomnieć o xrange()).
W pętli
Python ma też standardową pętlę while, a instrukcje *break* i *continue* działają tak samo jak w C++ i Javie, zmieniając przebieg pętli wewnętrznej. Powyższe pętle „for/in” rozwiązują typowy przypadek iteracji każdego elementu na liście, ale pętla „Podczas” daje Ci pełną kontrolę nad wartościami indeksu. Oto pętla while, która odczytuje co 3 element na liście:
## Access every 3rd element in a list i = 0 while i < len(a): print(a[i]) i = i + 3
Wyświetlanie listy metod
Oto kilka innych typowych metod tworzenia list.
- list.append(elem) – dodaje pojedynczy element na końcu listy. Częsty błąd: nie zwraca nowej listy, tylko modyfikuje oryginalną.
- list.insert(index, elem) – wstawia element pod podanym indeksem, przesuwając w prawo elementy o jeden.
- list.extend(list2) dodaje elementy z listy2 na koniec listy. Użycie znaku + lub += na liście jest podobne do użycia funkcji extend().
- list.index(elem) – wyszukuje podany element od początku listy i zwraca jego indeks. Wyrzuca ValueError, jeśli element nie występuje (użyj „in”, aby sprawdzić bez ValueError).
- list.remove(elem) – wyszukuje pierwszą instancję danego elementu i usuwa ją (wyrzuca ValueError, jeśli nie jest obecna)
- list.sort() -- sortuje listę na miejscu (nie zwraca tej listy). (Preferowana jest funkcja sortowana() widoczna później).
- list.reverse() – odwraca listę w miejscu (nie zwraca jej).
- list.pop(index) – usuwa i zwraca element o podanym indeksie. Zwraca element z najbardziej prawej strony, jeśli indeks jest pominięty (w przybliżeniu przeciwieństwo append()).
Zwróć uwagę, że są to *metody* w obiekcie listy, a len() to funkcja, która przyjmuje listę (lub ciąg znaków) jako argument.
list = ['larry', 'curly', 'moe'] list.append('shemp') ## append elem at end list.insert(0, 'xxx') ## insert elem at index 0 list.extend(['yyy', 'zzz']) ## add list of elems at end print(list) ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz'] print(list.index('curly')) ## 2 list.remove('curly') ## search and remove that element list.pop(1) ## removes and returns 'larry' print(list) ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']
Częsty błąd: pamiętaj, że powyższe metody nie *zwracają* zmodyfikowanej listy, tylko modyfikują oryginalną listę.
list = [1, 2, 3] print(list.append(4)) ## NO, does not work, append() returns None ## Correct pattern: list.append(4) print(list) ## [1, 2, 3, 4]
Wyświetlanie listy kompilacji
Typowym wzorcem jest utworzenie pustej listy [] i dodanie do niej elementów za pomocą append() lub extend():
list = [] ## Start as the empty list list.append('a') ## Use append() to add elements list.append('b')
Wyświetlanie listy wycinków
Kroje działają na listach tak samo jak na ciągi tekstowe. Można ich też używać do zmiany części listy.
list = ['a', 'b', 'c', 'd'] print(list[1:-1]) ## ['b', 'c'] list[0:2] = 'z' ## replace ['a', 'b'] with ['z'] print(list) ## ['z', 'c', 'd']
Ćwiczenie: list1.py
Aby ćwiczyć materiał z tej sekcji, rozwiązuj zadania z pliku list1.py, które nie wykorzystują sortowania (w podstawowych ćwiczeniach).