Listy Pythona

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

lista ciągów tekstowych „czerwony”, „niebieski”, „zielony”

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

oba kolory i b wskazują na jedną 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).