Lesson 7
 Listy
    1. Listy
Większość programów działa nie tylko ze zmiennymi. Korzystają również z list zmiennych. Na przykład program może obsłużyć informacje o uczniach w klasie, czytając listę uczniów z klawiatury lub z pliku. Zmiana liczby uczniów w klasie nie może wymagać modyfikacji kodu źródłowego programu.
Wcześniej mieliśmy już do czynienia z przetwarzaniem elementów sekwencji - na przykład przy obliczaniu największego elementu sekwencji. Ale nie zachowaliśmy całej sekwencji w pamięci komputera. Jednak w wielu problemach konieczne jest zachowanie całej sekwencji, tak jakbyśmy musieli wydrukować wszystkie elementy sekwencji w porządku rosnącym ("sortuj sekwencję").
Aby przechowywać takie dane, w Pythonie można użyć struktury danych nazywanej listą (w większości języków programowania używany jest inny termin - "tablica"). Lista jest sekwencją elementów ponumerowanych od 0, podobnie jak znaki w łańcuchu. Listę można ustawić ręcznie, wyliczając elementy na liście w nawiasach kwadratowych, na przykład tutaj:
Primes = [2, 3, 5, 7, 11, 13] Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
 Lista Primes ma 6 elementów, a mianowicie: Primes[0] == 2 , Primes[1] == 3 , Primes[2] == 5 , Primes[3] == 7 , Primes[4] == 11 , Primes[5] == 13 . Lista Rainbow ma 7 elementów, z których każdy jest ciągiem. 
 Podobnie jak znaki w łańcuchu, elementy listy mogą również mieć indeks ujemny, na przykład: Primes[-1] == 13 , Primes[-6] == 2 . Indeks ujemny oznacza, że zaczynamy od ostatniego elementu i przechodzimy w lewo podczas czytania listy. 
 Możesz uzyskać liczbę elementów na liście z funkcją len (oznaczającą długość listy ), np. len(Primes) == 6 liczby pierwsze len(Primes) == 6 . 
W przeciwieństwie do łańcuchów elementy listy są zmienne; można je zmienić, przypisując im nowe wartości.
Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
print(Rainbow[0])
Rainbow[0] = 'red'
print('Print the rainbow')
for i in range(len(Rainbow)):
    print(Rainbow[i])
 Rozważ kilka sposobów tworzenia i czytania list. Przede wszystkim możesz utworzyć pustą listę (lista bez pozycji, jej długość to 0), a możesz dodać pozycje na końcu listy używając append . Załóżmy na przykład, że program otrzymuje liczbę elementów na liście n , a następnie n elementów listy po kolei w osobnej linii. Oto przykład danych wejściowych w tym formacie: 
5 1809 1854 1860 1891 1925W takim przypadku możesz uporządkować czytanie z takiej listy w następujący sposób:
a = [] # rozpocząć pustą listę
n = int(input()) # odczytać numer elementu na liście
for i in range(n): 
    new_element = int(input()) # przeczytaj następny element
    a.append(new_element) # dodaj go do listy
    # dwie ostatnie linie można zastąpić jedną:
    # a.append (int (input ()))
print(a)
 W zademonstrowanym przykładzie tworzona jest pusta lista, następnie odczytywana jest liczba elementów, a następnie czytane elementy listy wiersz po wierszu i dołączane do końca. To samo można zrobić, zapisując zmienną n :
a = []
for i in range(int(input())):
    a.append(int(input()))
print(a)
Istnieje kilka operacji zdefiniowanych dla list: lista konkatenacja (dodanie list, tj. "Przyklejanie" jednej listy do drugiej) i powtarzanie (mnożenie listy przez liczbę). Na przykład:
a = [1, 2, 3] b = [4, 5] c = a + b d = b * 3 print([7, 8] + [9]) print([0, 1] * 3)
 Wynikowa lista c będzie równa [1, 2, 3, 4, 5] , a lista d będzie równa [4, 5, 4, 5, 4, 5] . To pozwala ci inaczej organizować proces czytania list: najpierw rozważ rozmiar listy i utwórz listę z żądanej liczby elementów, następnie przeprowadź pętlę przez zmienną i zaczynając od cyfry 0 i wewnątrz pętli przeczytaj i element listy:
a = [0] * int(input())
for i in range(len(a)):
    a[i] = int(input())
 Możesz wydrukować elementy listy a z print(a) ; wyświetla elementy listy otoczone nawiasami kwadratowymi i oddzielone przecinkami. Ogólnie jest to niewygodne; razem, masz zamiar wydrukować wszystkie elementy w jednym wierszu lub po jednym elemencie w linii. Oto dwa przykłady tego, używając innych form pętli:
a = [1, 2, 3, 4, 5]
for i in range(len(a)):
    print(a[i])
 Tutaj zmienia się indeks i następnie wyświetlany jest element a[i] .
a = [1, 2, 3, 4, 5]
for elem in a:
    print(elem, end=' ')
 W tym przykładzie elementy listy są wyświetlane w jednym wierszu oddzielonym spacjami, a nie zmienionym indeksem, ale wartością samej zmiennej (na przykład w pętli for elem in ['red', 'green', 'blue'] variable elem będzie kolejno przyjmować wartości 'red' , 'green' , 'blue' . 
 Zwróć szczególną uwagę na ostatni przykład! Bardzo ważnym elementem Python ideologii for pętli, która zapewnia wygodny sposób przechodzenia przez wszystkie elementy niektórych sekwencji. W tym miejscu Python różni się od Pascala, gdzie trzeba powtarzać indeksy elementów, ale nie nad samymi elementami. 
 Sekwencje w Pythonie to ciągi, listy, wartości range() funkcji range() (nie są to listy) i kilka innych obiektów. 
 Oto przykład pokazujący użycie pętli for , gdy trzeba wyodrębnić wszystkie cyfry z ciągu znaków i utworzyć ich listę numeryczną.
# dany: s = 'ab12c59p7dq'
# musisz wyodrębnić cyfry z listy s
# aby tak było:
# cyfry == [1, 2, 5, 9, 7]
s = 'ab12c59p7dq'
digits = []
for symbol in s:
    if '1234567890'.find(symbol) != -1:
        digits.append(int(symbol))
print(digits)
2. Metody dzielenia i łączenia
 Elementy listy można podać w jednym wierszu oddzielonym znakiem; w tym przypadku całą listę można odczytać za pomocą metody input() . Następnie można użyć metody split() , która zwraca listę ciągów wynikowych po obcięciu początkowego łańcucha spacjami. Przykład:
# wejście to ciąg znaków # 1 2 3 s = input() # s == '1 2 3' a = s.split() # a == ['1', '2', '3'] print(a)
 Jeśli uruchomisz ten program z danymi wejściowymi 1 2 3 , lista a będzie równa ['1', '2', '3'] . Pamiętaj, że lista składa się z ciągów, a nie liczb. Jeśli chcesz uzyskać listę numerów, musisz przekonwertować elementy listy jeden po drugim na liczby całkowite:
a = input().split()
for i in range(len(a)):
    a[i] = int(a[i])
print(a)
Używając specjalnej magii Pythona - generatorów - to samo można zrobić w jednej linii:
a = [int(s) for s in input().split()] print(a)
 (Wyjaśnimy, jak działa ten kod w następnej sekcji.) Jeśli chcesz przeczytać listę liczb rzeczywistych, musisz zmienić typ int na float . 
 Metoda split() ma opcjonalny parametr, który określa, który ciąg znaków będzie używany jako separator między elementami listy. Na przykład wywołanie metody split('.') Zwraca listę uzyskaną przez podzielenie początkowego łańcucha, w którym znajduje się znak '.' napotkano:
a = '192.168.0.1'.split('.')
print(a)
 W Pythonie możesz wyświetlać listę ciągów przy użyciu komend jednoliniowych. W tym celu stosuje się metodę join ; ta metoda ma jeden parametr: listę łańcuchów. Zwraca ciąg otrzymany przez konkatenację podanych elementów, a separator wstawiany jest między elementy listy; ten separator jest równy ciągowi, na którym jest zastosowana metoda. Wiemy, że nie zrozumiałeś poprzedniego zdania od pierwszego razu. :) Spójrz na przykłady:
a = ['red', 'green', 'blue']
print(' '.join(a))
# powrót czerwony zielony niebieski
print(''.join(a))
# return redgreenblue
print('***'.join(a))
# zwraca czerwony *** zielony *** niebieski
Jeśli lista składa się z liczb, musisz użyć mrocznej magii generatorów. Oto jak możesz wydrukować elementy listy oddzielone spacjami:
a = [1, 2, 3]
print(' '.join([str(i) for i in a]))
# następna linia powoduje błąd typu,
# as join () może łączyć tylko sekwencje
# print (".join (a))
 Jednakże, jeśli nie jesteś fanem czarnej magii, można osiągnąć ten sam efekt przy użyciu pętli for .
    
3. Generatory
Aby utworzyć listę wypełnioną identycznymi przedmiotami, możesz użyć listy powtórzeń, na przykład:
n = 5 a = [0] * n print(a)
Aby utworzyć bardziej skomplikowane listy, możesz użyć generatorów : wyrażeń pozwalających wypełnić listę zgodnie z formułą. Ogólna forma generatora jest następująca:
[expression for variable in sequence]
 gdzie variable jest identyfikatorem pewnej zmiennej, sequence jest ciągiem wartości, który przyjmuje zmienną (może to być lista, ciąg lub obiekt uzyskany za pomocą range funkcji), expression - pewne wyrażenie, zwykle w zależności od zmiennej stosowane w generatorze. Elementy listy zostaną wypełnione zgodnie z tym wyrażeniem. 
Oto kilka przykładów osób korzystających z generatorów.
 W ten sposób można utworzyć listę n zer przy użyciu generatora:
a = [0 for i in range(5)] print(a)
Oto jak utworzyć listę wypełnioną kwadratami liczb całkowitych:
n = 5 a = [i ** 2 for i in range(n)] print(a)
 Jeśli chcesz wypełnić listę kwadratów liczb od 1 do n , możesz zmienić ustawienia range na range(1, n + 1) :
n = 5 a = [i ** 2 for i in range(1, n + 1)] print(a)
 Oto jak można uzyskać listę wypełnioną liczbami losowymi od 1 do 9 (używając randrange z modułu random ):
from random import randrange n = 10 a = [randrange(1, 10) for i in range(n)] print(a)
 W tym przykładzie lista będzie składała się z linii odczytanych ze standardowego wejścia: najpierw należy wprowadzić liczbę elementów listy (ta wartość będzie używana jako argument range funkcji), po drugie - liczba łańcuchów:
a = [input() for i in range(int(input()))] print(a)
4. Plastry
Dzięki listom i ciągom możesz tworzyć plasterki. Mianowicie:
 A[i:j] wycinek ji elementy A[i] , A[i+1] , ..., A[j-1] . 
 A[i:j:-1] slice ij elementy A[i] , A[i-1] , ..., A[j+1] (czyli zmiana kolejności elementów). 
 A[i:j:k] pocięte z krokiem k : A[i] , A[i+k] , A[i+2*k] , .... Jeśli wartość k <0, elementy występują w odwrotnej kolejności. 
 Każda z liczb i lub j może być nieobecna, co oznacza "początek linii" lub "koniec linii" 
Listy, w przeciwieństwie do łańcuchów, są zmiennymi obiektami : możesz przypisać element listy do nowej wartości. Co więcej, możliwa jest zmiana całych plasterków. Na przykład:
A = [1, 2, 3, 4, 5] A[2:4] = [7, 8, 9] print(A)
 Otrzymaliśmy listę [1, 2, 3, 4, 5] , a następnie spróbuj zastąpić dwa elementy wycinka A[2:4] nową listą trzech elementów. Wynikowa lista jest następująca: [1, 2, 7, 8, 9, 5] .
A = [1, 2, 3, 4, 5, 6, 7] A[::-2] = [10, 20, 30, 40] print(A)
 I tutaj, wynikowa lista będzie [40, 2, 30, 4, 20, 6, 10] . Powodem jest, że A[::-2] jest listą elementów A[-1] , A[-3] , A[-5] , A[-7] , a te elementy są przypisane do 10, 20, 30, 40, odpowiednio. 
 Jeśli nieciągłemu wycinkowi (tj. Plasterkowi z krokiem k , k > 1 ) przypisywana jest nowa wartość, to liczba elementów w starych i nowych plasterkach musi się pokrywać, w przeciwnym razie wystąpi błąd ValueError . 
 Zauważ, że A[i] to element listy, a nie plasterek!
    
5. Operacje na listach
Z listami można łatwo wykonywać wiele różnych operacji.
|  x w A  |  Sprawdź, czy element na liście. Zwraca True lub False  | 
|  x nie w A  |  Tak samo jak nie (x w A)  | 
|  min (A)  |  Najmniejszy element listy  | 
|  maks. (A)  |  Największy element na liście  | 
|  A.indeks (x)  |  Indeks pierwszego wystąpienia elementu x na liście; w przypadku jego braku generuje wyjątek ValueError  | 
|  A.count (x)  |  Liczba wystąpień elementu x na liście  |