Jak pracować z typem danych listy Pythona

Python zawiera kolekcję wbudowanych typów danych, które ułatwiają wykonywanie typowych operacji związanych z manipulowaniem danymi. Wśród nich jest  lista , prosty, ale wszechstronny typ kolekcji. Dzięki liście Python można grupować obiekty Pythona w jednowymiarowy wiersz, który umożliwia dostęp do obiektów według pozycji, dodawanie, usuwanie, sortowanie i dzielenie.

Podstawy list w Pythonie

Definiowanie listy w Pythonie jest łatwe - wystarczy użyć składni nawiasów, aby wskazać elementy na liście.

list_of_ints = [1, 2, 3]

Pozycje na liście też nie muszą być tego samego typu. Może to być dowolny obiekt Pythona. (Tutaj załóżmy, że  Three jest to funkcja.)

list_of_objects = ["Jeden", DWA, Trzy, {"Cztery": 4}, Brak]

Zauważ, że posiadanie mieszanych obiektów na liście może mieć wpływ na sortowanie listy. Wrócimy do tego później.

Największym powodem używania listy jest możliwość znajdowania obiektów na podstawie ich pozycji na liście. Aby to zrobić, użyj notacji indeksu Pythona: liczba w nawiasach, zaczynająca się od 0, która wskazuje pozycję elementu na liście.

W powyższym przykładzie list_of_ints[0]yields 1. list_of_ints[1]plony 2. list_of_objects[4]byłby  None obiektem.

Indeksowanie list Pythona

Jeśli użyjesz dodatniej liczby całkowitej dla indeksu, liczba ta wskazuje pozycję poszukiwanego elementu. Ale jeśli użyjesz  ujemnej  liczby całkowitej, to liczba ta wskazuje pozycję zaczynającą się od  końca  listy. Na przykład użycie indeksu -1jest wygodnym sposobem na pobranie ostatniej pozycji z listy, bez względu na jej rozmiar.

list_of_ints[-1] plony  3list_of_objects[-1] plony  None.

Jako indeksu można również użyć zmiennej całkowitej. Jeśli  x=0list_of_ints[x] rentowności 1, i tak dalej.

Dodawanie i usuwanie elementów listy Pythona

Python oferuje kilka sposobów dodawania lub usuwania elementów z listy.

  • .append() wstawia element na  końcu  listy. Na przykład list_of_ints.append(4)zmieni  list_of_ints się w listę  [1,2,3,4]. Dodatki są szybkie i wydajne; dołączenie jednej pozycji do listy zajmuje mniej więcej tyle samo czasu, niezależnie od jej długości.
  • .pop() usuwa i zwraca ostatnią pozycję z listy. Gdybyśmy uruchomili  x = list_of_ints.pop() oryginał  list_of_ints, x zawierałoby wartość  3. (Nie musisz jednak przypisywać wyników  .pop() do wartości, jeśli jej nie potrzebujesz).  .pop()Operacje są również szybkie i wydajne.
  • .insert() wstawia element w dowolnym miejscu na liście. Na przykład  list_of_ints.insert(0,10) zmieni się  list_of_intsw [10,1,2,3]. Zwróć uwagę, że im bliżej początku listy wstawisz, tym wolniejsza będzie ta operacja, chociaż nie zobaczysz dużego spowolnienia, chyba że lista zawiera wiele tysięcy elementów lub wykonujesz wstawianie w ciasnej pętli.
  • .pop(x) usuwa element w indeksie  x. Usunąłby więc  list_of_ints.pop(0) element o indeksie 0. Ponownie, im bliżej początku listy, tym wolniejsza może być ta operacja.
  • .remove(item) usuwa element z listy, ale  nie  na podstawie indeksu. Zamiast tego .remove()usuwa  pierwsze wystąpienie  określonego obiektu, wyszukując od góry listy w dół. Ponieważ  [3,7,7,9,8].remove(7)pierwsza  7 zostanie usunięta, co spowoduje powstanie listy  [3,7,9,8]. Ta operacja również może spowolnić w przypadku dużej listy, ponieważ teoretycznie musi przejść przez całą listę, aby działać.

Krojenie listy Pythona

Listy można podzielić na nowe listy, co nazywa się  wycinaniem . Składnia wycinka w Pythonie pozwala określić, która część listy ma zostać wycięta i jak manipulować tą częścią.

Widziałeś powyżej, jak używać notacji nawiasów, aby uzyskać pojedynczy element z listy: my_list[2]na przykład. Plastry użyć wariant tej samej notacji indeksu (i według tych samych zasad indeksowania) list_object[start:stop:step].

  • start to pozycja na liście, od której rozpoczyna się wycinek. 
  • stop to pozycja na liście, w której kończymy cięcie. Innymi słowy,  ta pozycja i wszystko po niej  jest pomijane.
  • step jest opcjonalnym wskaźnikiem „każdego n-tego elementu” dla wycinka. Domyślnie tak jest  1, więc wycinek zachowuje każdy element z listy, z której jest wycinany. Ustaw stepna  2, a wybierzesz co drugi element i tak dalej.

Oto kilka przykładów. Rozważ tę listę:

slice_list = [1,2,3,4,5,6,7,8,9,0]

lista_krawków [0: 5] = [1, 2, 3, 4, 5]

(Zwróć uwagę, że zatrzymujemy się na indeksie 4, a nie indeksie 5!)

lista_krawków [0: 5: 2] = [1, 3, 5]

Jeśli pominiesz określony indeks wycinka, Python przyjmie wartość domyślną. Zostaw indeks początkowy, a Python zakłada początek listy:

lista_krawków [: 5] = [1, 2, 3, 4, 5]

Zostaw indeks stop, a Python zakłada koniec listy:

lista_krawków [4:] = [5, 6, 7, 8, 9, 0]

step Element może mieć także  negatywny . Dzięki temu możemy wziąć wycinki, które są odwróconymi kopiami oryginału:

lista_krawków [:: - 1] = [0, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Zauważ, że możesz kroić w odwrotnej kolejności, używając indeksów start i stop, które idą do tyłu, a nie do przodu:

lista_krawków [5: 2: -1] = [6, 5, 4]

Należy również pamiętać, że wycinki list są  kopiami  oryginalnej listy. Oryginalna lista pozostaje niezmieniona. 

[Również na: Najlepsze bezpłatne kursy nauki o danych podczas kwarantanny]

Sortowanie listy w Pythonie

Python udostępnia dwa sposoby sortowania list: możesz wygenerować nową posortowaną listę na podstawie starej lub możesz posortować istniejącą listę w miejscu. Te opcje mają różne zachowania i różne scenariusze użycia.

Aby utworzyć nową, posortowaną listę, użyj  sorted() funkcji na starej liście:

new_list = posortowane (stara_lista)

Spowoduje to posortowanie zawartości listy przy użyciu domyślnych metod sortowania Pythona. W przypadku ciągów domyślną jest kolejność alfabetyczna; dla liczb są to wartości rosnące. Zwróć uwagę, że zawartość listy musi być spójna, aby to zadziałało. Na przykład nie możesz sortować kombinacji liczb całkowitych i ciągów, ale możesz sortować listę zawierającą wszystkie liczby całkowite lub wszystkie ciągi. W przeciwnym razie otrzymasz  TypeError w operacji sortowania.

Jeśli chcesz posortować listę w odwrotnej kolejności, przekaż  reverse parametr:

new_list = sorted(old_list, reverse=True)

The other way to sort, in-place sorting, performs the sort operation directly on the original list. To do this, use the list’s .sort()method:

old_list.sort()

.sort() also takes reverse as a parameter, allowing you to sort in reverse.

Both sorted() and .sort() also take a key parameter. The key parameter lets you provide a function that can be used to perform a custom sorting operation. When the list is sorted, each element is passed to the key function, and the resulting value is used for sorting. For instance, if we had a mix of integers and strings, and we wanted to sort them, we could use key like this:

mixed_list = [1,"2",3,"4", None] def sort_mixed(item): try: return int(item) except: return 0 sorted_list = sorted(mixed_list, key = sort_mixed) print (sorted_list)

Note that this code wouldn’t convert each element of the list into an integer! Rather, it would use the integer value of each item as its sort value. Also note how we use a try/except block to trap any values that don’t translate cleanly into an integer, and return 0 for them by default.

Python lists are not arrays

One important thing to know about lists in Python is that they aren’t “arrays.” Other languages, like C, have one-dimensional or multi-dimensional constructions called arrays that accept values of a single type. Lists are heterogenous; they can accept objects of any type.

What’s more, there is a separate array type in Python. The Python array is designed to emulate the behavior of an array in C, and it’s meant chiefly to allow Python to work with C arrays. The array type is useful in those cases, but in almost every pure-Python case you’ll want to use lists.

When to use Python lists (and when not to)

So when are Python lists most useful? A list is best when:

  • You need to find things quickly by their position in a collection. Accessing any position in a list takes the same amount of time, so there is no performance penalty for looking up even the millionth item in a list.
  • You’re adding and removing to the collection mainly by appending to the end or removing from the end, in the manner of a stack. Again, these operations take the same amount of time regardless of the length of the list.

A Python list is less suitable when:

  • You want to find an item in a list, but you don’t know its position. You can do this with the .index() property. For instance, you could use list_of_ints.index(1) to find the index of the first occurrence of the number 1 in list_of_ints. Speed should not be not an issue if your list is only a few items long, but for lists thousands of items long, it means Python has to search the entire list. For a scenario like this, use a dictionary, where each item can be found using a key, and where the lookup time will be the same for each value.
  • You want to add or remove items from any position but the end. Each time you do this, Python must move every other item after the added or removed item. The longer the list, the greater the performance issue this becomes. Python’s deque object is a better fit if you want to add or remove objects freely from either the start or the end of the list.

How to do more with Python

  • How to package Python apps with BeeWare Briefcase
  • How to run Anaconda side by side with other Pythons
  • How to use Python dataclasses
  • Get started with async in Python
  • How to use asyncio in Python
  • 3 steps to a Python async overhaul
  • How to use PyInstaller to create Python executables
  • Cython tutorial: How to speed up Python
  • How to install Python the smart way
  • How to manage Python projects with Poetry
  • How to manage Python projects with Pipenv
  • Virtualenv i venv: wyjaśniono wirtualne środowiska Pythona
  • Python virtualenv i venv co robić, a czego nie
  • Wyjaśnienie wątków i podprocesów w Pythonie
  • Jak korzystać z debugera Pythona
  • Jak używać timeit do profilowania kodu Pythona
  • Jak używać cProfile do profilowania kodu Pythona
  • Jak przekonwertować Python na JavaScript (iz powrotem)