Lists - Learn Python 3 - Snakify

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
1925
W 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)
Advertising by Google, may be based on your interests

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 .

Advertising by Google, may be based on your interests

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)
Advertising by Google, may be based on your interests

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!

Advertising by Google, may be based on your interests

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
Advertising by Google, may be based on your interests