Как да работите с типа данни на списъка на Python

Python се предлага с колекция от вградени типове данни, които улесняват обичайните операции по преместване на данни. Сред тях е  списъкът , прост, но универсален тип колекция. Със списък на Python можете да групирате обекти на Python заедно в едноизмерен ред, който позволява достъп до обекти по позиция, добавяне, премахване, сортиране и подразделяне.

Основи на списъка на Python

Определянето на списък в Python е лесно - просто използвайте синтаксиса на скобите, за да посочите елементи в списък.

list_of_ints = [1, 2, 3]

Не е задължително всички елементи в списъка да са от един и същи тип. Те могат да бъдат всеки обект на Python. (Тук приемете, че  Three е функция.)

list_of_objects = ["One", TWO, Three, {"Four": 4}, None]

Имайте предвид, че наличието на смесени обекти в списък може да има значение за сортирането на списъка. Ще влезем в това по-късно.

Най-голямата причина да използвате списък е да можете да намирате обекти според тяхната позиция в списъка. За да направите това, използвате индексната нотация на Python: число в скоби, започващо от 0, което показва позицията на елемента в списъка.

За горния пример list_of_ints[0]добиви 1. list_of_ints[1]добиви 2. list_of_objects[4]би бил  None обектът.

Индексиране на списъка на Python

Ако използвате положително цяло число за индекса, цялото число показва позицията на елемента, който да търсите. Но ако използвате  отрицателно  цяло число, тогава цялото число показва позицията, започваща от  края  на списъка. Например използването на индекс на -1е удобен начин да вземете последния елемент от списък, независимо от размера на списъка.

list_of_ints[-1] добиви  3list_of_objects[-1] добиви  None.

Можете също да използвате целочислена променлива като свой индекс. Ако  x=0list_of_ints[x] дава 1 и т.н.

Добавяне и премахване на елементи от списъка на Python

Python има няколко начина, по които можете да добавяте или премахвате елементи от списък.

  • .append() вмъква елемент в  края  на списъка. Например, list_of_ints.append(4)ще се превърне  list_of_ints в списъка  [1,2,3,4]. Приложенията са бързи и ефективни; отнема приблизително същото време, за да добавите един елемент към списък, без значение колко дълъг е списъкът.
  • .pop() премахва и връща последния елемент от списъка. Ако бяхме  x = list_of_ints.pop() на оригинала  list_of_ints, x щеше да съдържа стойността  3. (Не е нужно обаче да присвоявате резултатите на  .pop() стойност, ако нямате нужда от нея.)  .pop()Операциите също са бързи и ефективни.
  • .insert() вмъква елемент на произволна позиция в списъка. Например,  list_of_ints.insert(0,10) ще се превърне  list_of_intsв [10,1,2,3]. Обърнете внимание, че колкото по-близо вмъкнете в предната част на списъка, толкова по-бавна ще бъде тази операция, въпреки че няма да видите голямо забавяне, освен ако списъкът ви има много хиляди елементи или ако не правите вмъкванията в стегнат цикъл.
  • .pop(x) премахва елемента в индекса  x. Така  list_of_ints.pop(0) бихте премахнали елемента с индекс 0. Отново, колкото по-близо сте до предната част на списъка, толкова по-бавна може да бъде тази операция.
  • .remove(item) премахва елемент от списък, но  не  въз основа на неговия индекс. По-скоро .remove()премахва  първата поява  на обекта, който сте посочили, търсейки от горната част на списъка надолу. Защото  [3,7,7,9,8].remove(7)първият  7 ще бъде премахнат, което ще доведе до списъка  [3,7,9,8]. Тази операция също може да се забави за голям списък, тъй като теоретично трябва да премине целия списък, за да работи.

Нарязване на списък на Python

Списъците могат да бъдат разделени на нови списъци, процес, наречен  нарязване . Синтаксисът на среза на Python ви позволява да посочите коя част от списък да се издълбае и как да се манипулира издълбаната част.

Видяхте по-горе как да използвате нотация на скоби, за да получите един елемент от списък: my_list[2]например. Slices използват вариант на един и същ индекс означението (и следното едни и същи правила за индексиране): list_object[start:stop:step].

  • start е позицията в списъка за стартиране на среза. 
  • stop е позицията в списъка, където спираме да нарязваме. С други думи,  тази позиция и всичко след нея  са пропуснати.
  • step е незадължителен индикатор „всеки n-ти елемент“ за среза. По подразбиране това е  1, така че среза запазва всеки елемент от списъка, от който се нарязва. Задайте stepна  2и ще изберете всеки втори елемент и т.н.

Ето няколко примера. Помислете за този списък:

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

slice_list [0: 5] = [1, 2, 3, 4, 5]

(Обърнете внимание, че спираме при индекс 4, а не индекс 5!)

slice_list [0: 5: 2] = [1, 3, 5]

Ако пропуснете определен индекс на среза, Python приема подразбиране. Оставете началния индекс и Python приема началото на списъка:

slice_list [: 5] = [1, 2, 3, 4, 5]

Оставете индекса за спиране и Python приема края на списъка:

slice_list [4:] = [5, 6, 7, 8, 9, 0]

В  step елемент може да бъде  отрицателен . Това ни позволява да правим резени, които са обърнати копия на оригинала:

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

Обърнете внимание, че можете да нарязвате в обратен ред, като използвате индекси за стартиране и спиране, които вървят назад, а не напред:

slice_list [5: 2: -1] = [6, 5, 4]

Също така имайте предвид, че резените от списъци са  копия  на оригиналния списък. Оригиналният списък остава непроменен. 

[Също на: Най-добрите безплатни курсове по наука за данни по време на карантина]

Сортиране на списък на Python

Python provides two ways to sort lists: You can generate a new, sorted list from the old one, or you can sort an existing list in-place. These options have different behaviors and different usage scenarios.

To create a new, sorted list, use the sorted() function on the old list:

new_list = sorted(old_list)

This will sort the contents of the list using Python’s default sorting methods. For strings, the default is alphabetical order; for numbers, it’s ascending values. Note that the contents of the list need to be consistent for this to work. For instance, you can’t sort a mix of integers and strings, but you can sort a list that is all integers or all strings. Otherwise you’ll get a TypeError in the sort operation.

If you want to sort a list in reverse, pass the reverse parameter:

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 и venv: Обяснени са виртуалните среди на Python
  • Python virtualenv и venv правят и не
  • Обяснение на нишките на Python и подпроцесите
  • Как да използвам Python дебъгер
  • Как да използвам timeit за профилиране на Python код
  • Как да използвам cProfile за профилиране на Python код
  • Как да конвертирате Python в JavaScript (и обратно)