Listy Pythona

Python ma świetny wbudowany typ listy o nazwie „list”. Literały listy należy wpisać w nawiasach kwadratowych [ ]. Listy działają podobnie do ciągów znaków. Aby uzyskać dostęp do danych, użyj funkcji len() i nawiasów kwadratowych [ ]. 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 znaków „czerwony” „niebieski zielony”

Projekt z znakiem = 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

zarówno kolory, jak i b wskazują jedną listę.

„Pusta lista” to po prostu pusta para nawiasów [ ]. Znak „+” dodaje dwie listy, więc [1, 2] + [3, 4] daje [1, 2, 3, 4] (podobnie jak znak + w przypadku ciągów znaków).

FOR i IN

Konstrukcje *for* i *in* w języku Python są bardzo przydatne. Pierwszym zastosowaniem ich w praktyce będzie użycie list. Konstrukcja *for* – for var in list – umożliwia łatwe przeglądanie każdego elementu na liście (lub w innym zbiorze). Podczas iteracji nie dodawaj ani nie usuwaj listy.

  squares = [1, 4, 9, 16]
  sum = 0
  for num in squares:
    sum += num
  print(sum)  ## 30

Jeśli wiesz, jakiego rodzaju znajduje się na liście, użyj w pętli nazwy zmiennej, która rejestruje te informacje, np. „num”, „name” lub „url”. Ponieważ kod Pythona nie ma innej składni przypominającej o typach, nazwy zmiennych są kluczowym sposobem na zapewnienie sprawności. (Ta odpowiedź może wprowadzać w błąd. Wraz ze wzrostem ekspozycji na język Python pojawią się odniesienia do wskazówki dotyczące wpisywania, które umożliwiają wpisywanie zapytań do definicji funkcji. Python nie korzysta z tych wskazówek dotyczących typów podczas uruchamiania Twoje programy. Są używane przez inne programy, takie jak IDE (zintegrowane środowiska programistyczne) narzędzia do analizy statycznej, takie jak lintery/sprawdzanie pisania, aby sprawdzać, czy funkcje są wywołane; ze zgodnymi 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, zwracając wartości Prawda/Fałsz.

  list = ['larry', 'curly', 'moe']
  if 'curly' in list:
    print('yay') ## yay

Konstrukcje for/in są bardzo powszechnie używane w kodzie Pythona i działają na typach danych innych niż lista, dlatego warto zapamiętać ich składnię. Być może masz nawyki z innych języków, w których zaczynasz ręcznie iterować kolekcję, a w Pythonie używaj tylko tych języków.

Za pomocą funkcji for/in możesz też pracować nad ciągiem. Ciąg znaków działa jak lista znaków, więc for ch in s: print(ch) drukuje wszystkie zawarte w nim znaki.

Zakres

Funkcja zakres(n) zwraca liczby 0, 1, ... n-1, a zakres(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 przypadku przypadków wrażliwych na wydajność (w Pythonie 3 funkcja zakres() będzie działać dobrze i możesz zapomnieć o funkcji xrange()).

W pętli

W Pythonie jest też standardowa pętla „if”, a instrukcje *break* i *continue* działają tak samo jak w C++ i Javie, zmieniając przebieg najbardziej wewnętrznej pętli. 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, która uzyskuje dostęp do co 3 elementu 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 inne popularne metody tworzenia list.

  • list.append(elem) – dodaje pojedynczy element na końcu listy. Typowy błąd: nie zwraca nowej listy, tylko modyfikuje oryginał.
  • list.insert(index, elem) – wstawia element o danym indeksie, przesuwając elementy w prawo.
  • list.extend(list2) dodaje elementy z listy list2 na końcu listy. Użycie na liście znaków + i += jest podobne do używania funkcji extensions().
  • list.index(elem) – wyszukuje dany element na początku listy i zwraca jego indeks. Jeśli element nie występuje, zwraca błąd ValueError (wpisz „in”, aby sprawdzić bez błędu ValueError).
  • list.remove(elem) – przeszukuje pierwsze wystąpienie danego elementu i usuwa je (jeśli nie ma wartości, zwraca błąd ValueError).
  • list.sort() -- sortuje listę na miejscu (nie zwraca tej listy). (Preferowana jest funkcja sortowana() widoczna później).
  • list.reverse() – odwraca obecną listę (nie zwraca tej listy);
  • list.pop(index) – usuwa i zwraca element o danym indeksie. Zwraca element znajdujący się najdalej na prawo w przypadku pominięcia indeksu (mniej więcej odwrotnie do funkcji include()).

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']

Typowy błąd: powyższe metody nie zwracają* zmodyfikowanej listy, tylko modyfikują pierwotną 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]

Budowanie listy

Jednym z typowych wzorców jest tworzenie listy jako pustej listy [], a następnie dodawanie do niej elementów za pomocą funkcji include() lub rozszerz():

  list = []          ## Start as the empty list
  list.append('a')   ## Use append() to add elements
  list.append('b')

Wyświetlanie listy wycinków

Wycinki działają na listach tak samo jak ciągi znaków. Można ich też używać do zmieniania 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 przećwiczyć materiał z tej sekcji, rozwiąż problemy z list1.py, które nie używają sortowania (z Ćwiczenia podstawowe).