13: Listy

Lista jest sekwencją kilku zmiennych, zgrupowanych pod jedną nazwą. Zamiast pisać program z wieloma zmiennymi x0, x1, x2, ... można zdefiniować pojedynczą zmienną x i uzyskać dostęp do jej elementów x[0], x[1], x[2] itd. Co ważniejsze, można umieścić inne wyrażenia i zmienne wewnątrz nawiasów kwadratowych, takich jak x[i] i x[i+1]. Pozwala to radzić sobie z dowolnie dużymi zbiorami danych przy użyciu tylko jednego małego kodu.
Jednym ze sposobów utworzenia listy jest otoczenie nawiasami kwadratowymi kilku wartości oddzielonych przecinkami:

myList = ["the first value in the list", 1999, 4.5]
Spowoduje to utworzenie listy o nazwie myList o długości 3. Każdy element listy otrzymuje numer zwany indeksem: element początkowy ma indeks 0, następny element ma indeks 1 i tak dalej. Poszczególne zmienne zawierające listę mają nazwy

«listName»[«indexNumber»]

W tym przykładzie myList[0] to zmienna, której wartością jest łańcuch "the first value in the list" i print(myList[2]) spowoduje wydruk 4.5. Można również zmieniać wartości elementów na liście i wydrukować całe listy:

Przykład
Aktualizowanie i drukowanie listy.

Jak widać numbers[0] traktowane jest jak zmienna: ma wartość i można ją zmienić.

Spróbuj przewidzieć końcowy stan wizualizowanego przykładu poniżej, a następnie porównaj go ze stanem uzyskanym po uruchomieniu kodu.

Dobrze! Spójrz na instrukcje przypisania (druga linia). Wartość rzeczy [3] po prawej stronie wynosi 12. Po lewej stronie rzeczy [0] to 2, więc rzeczy [stuff [0]] odnoszą się do zmiennych [2]. Wartość tej zmiennej jest aktualizowana (od 80) do 12.

Zadanie wielokrotnego wyboru: Meta-Rzeczy
Jaki będzie wynik następnego fragmentu kodu?

stuff = [2, 25, 80, 12]
stuff[stuff[0]] = stuff[3]
print(stuff)
Dobrze! Spójrz na instrukcję przypisania (druga linia). Wartość stuff[3] po prawej stronie wynosi 12. Po lewej stronie, stuff[0] wynosi 2, więc stuff[stuff[0]] odnosi się do zmiennej stuff[2]. Wartość tej zmiennej jest aktualizowana (z 80 do 12).

To, co Python nazywa listą w większości innych języków programowania, jest nazywane tablicą. Python ma też coś innego & bardziej zaawansowane, co nazywa tablicami.

Typowy błąd

Jeśli spróbujesz zapytać Pythona o indeks, który nie istnieje, otrzymasz błąd:

Przykład
Błąd - "out-of-range".

W powyższym przykładzie, ponieważ myList ma długość 4, a pierwszy indeks wynosi 0, maksymalny możliwy indeks to 3. Pytanie o indeks 4, 5 lub coś większego powoduje ten rodzaj błędu.

Zwykłe użyteczne operacje

Długość Listy: len(«list»)

Aby określić liczbę elementów na liście, wywołujemy na tej liście funkcję len(). Sprawdź, w jaki sposób range jest używany w poniższym przykładzie.

Przykład
Uzyskanie długości listy i użycie jej do iteracji po liście..

W trakcie pisania kodu zazwyczaj używamy polecenie len, które może pracować na listach o dowolnej długości, jak w powyższym przykładzie i w następnym ćwiczeniu.

Zadanie na kodowanie : Małpa w Środku
Napisz funkcję middle(L), która przyjmuje listę L jako swoje argumenty i zwraca element ze środkowej pozycji L. (Aby środek był dobrze zdefiniowany, należy założyć, że L ma nieparzystą długość.) Na przykład , wywołanie middle([8, 0, 100, 12, 1])100, ponieważ znajduje się dokładnie w środku listy.
Wpisz polecenia takie jak print(mafonction("test-argument")) w polu poniżej.

Czy listy są takie same jak łańcuchy?

W tym momencie można zauważyć, że operacje na listach są takie same jak na łańcuchach: obie można przekazać do funkcji len() w celu uzyskania ich długości, obie korzystają z X[«index»] do wyodrębnienia poszczególnych elementów. Listy i łańcuchy są rzeczywiście powiązane: obie w Pythonie są to "typy sekwencji". Jedną z głównych różnic jest to, że nie można w łańcuchach zmieniać pojedynczych znaków.

Przykład
Błąd spowodowany próbą przypisania wartości do znaku w łańcuchu.

Z tego powodu listy nazywane są typem zmiennym, a łańcuchy niezmiennym; Zobaczysz więcej informacji na ten temat w lekcji 17.

Łączenie i Tworzenie

Z lekcji o typie strwiemy, że możliwe jest użycie + do scalenia (łączenia) dwóch łańcuchów. Możesz to samo robić z listami:

Przykład
Łączenie list z użyciem +.

Podobnie można użyć symbolu mnożenia * do rozszerzenia listy przez jej powtórzenie. Jest to użyteczne przy tworzeniu nowej listy wymaganej długości.

Przykład
Użycie *.

Aby rozwiązać następne ćwiczenie, użyj jednego z operatorów, który właśnie wprowadziliśmy i pętli for.

Zadanie na kodowanie : To Naturalne
Napisz funkcję naturalNumbers, która przyjmuje dodatnią liczbę całkowitą n jako dane wejściowe i zwraca listę [1, 2, ...] składającą się z pierwszych n liczb naturalnych.
Wpisz polecenia takie jak print(mafonction("test-argument")) w polu poniżej.

Koniec Linii: Ujemne Indeksy

Aby pobrać ostatni element listy, użyj:

«listName»[-1]

Ogólnie rzecz biorąc, L[-k] zwraca k’aty element od końca listy; Python obsługuje to wewnętrznie przez przełożenie na L[len(L)-k]. Ten zapis również działa na łańcuchach!

Zadanie na kodowanie : Palindrom
Palindrom to słowo, które jest pisane tak samo do przodu jak do tyłu. Na przykład słowo

kajak

jest palindromem: pierwsze i ostatnie litery są takie same (k), drugie i przedostatnie litery są takie same (a), itp. Napisz funkcję isPalindrome(S), która pobiera ciąg S jako wejście i zwraca True Jeśli ciąg jest palindromem, a w przeciwnym wypadku False.

Wpisz polecenia takie jak print(mafonction("test-argument")) w polu poniżej.

max i sum

Funkcja max, którą widzieliśmy wcześniej, może być również zastosowana do listy numerów: zwraca największą liczbę z listy. Podobnie sum(L) zwraca sumę elementów z listy L.

Przykład

Zadanie na kodowanie : Iloczyn
Zdefiniuj funkcję prod(L), która zwraca iloczyn elementów listy L.
Wpisz polecenia takie jak print(mafonction("test-argument")) w polu poniżej.

Pętle poprzez Listy

Bardzo często (podobnie jak w poprzednim ćwiczeniu) pętla przechodzi przez każdą wartość listy. Python umożliwia skrót do wykonania tego typu operacji, nazywanej zwykle pętlą "for all" lub "for each". W szczególności, gdy L jest listą, ten kod

for x in L:
  «blok ciała pętli»
wykonuje następujące czynności: na początek x przyjmuje wartość pierwszej pozycji z L, a ciało jest wykonywane; następnie x przyjmuje drugą wartość z L, a ciało jest wykonywane; jest to kontynuowane dla wszystkich pozycji z L.

Oto wizualizowany przykład wydrukowania elementów listy:

Zadanie na kodowanie : for in
Zdefiniuj funkcję prod(L) jak poprzednio, ale tym razem, używając nowego rodzaju pętli.
Wpisz polecenia takie jak print(mafonction("test-argument")) w polu poniżej.

Pętla "for all" również działa na łańcuchach: spróbuj dla znaku w "hello".

Dobra robota! Możesz przejść do następnej lekcji lub spróbować wykonać kilka ćwiczeń bonusowych poniżej.


Zadanie krótkiej odpowiedzi: Tajemnicza Funkcja
Jaka będzie wartość x, która spowoduje, że mystery(x) będzie działać bez końca?

def mystery(x):
a = [0, 4, 0, 3, 2]
while x > 0:
x = a[x]
return "Done"
Bezbłędnie!

Zadanie na uporządkowanie: à la Mode
Mode listy to element, który występuje najczęściej (ten, który pojawia się maksymalnie razy). Rozkoduj poniższy program, tak aby mode(L) prawidłowo wskazywało mode, zakładając, że L to lista numerów od 0 do 9. (W naszych testach nie ma dwóch liczb, które osiągają maksymalną częstotliwość).
  • for i in range(0, 10):
  • for i in L:
  • if frequency[i]==max(frequency):
  • return i
  • def mode(L):
  • frequency = [0]*10
  • frequency[i] = frequency[i] + 1