Работа со списками

Список (list) — это одномерный динамический массив. То есть это массив, в который можно добавлять и убирать элементы по ходу работы программы:


my_list = []  # создали пустой список
my_list.append(5)  # добавили в список новый элемент
my_list.remove(5)  # убрали из списка элемент

Список помнит порядок следования элементов.

Список предоставляет доступ к значениям по индексам (номерам, которые отсчет начинаются с нуля):


my_list = [3, 1, 4, 1]  # создали список с 4 элементами
my_list[0] = 2  # заменяем первый элемент списка
print(my_list)  # печатает [2, 1, 4, 1]

Элементы списка могут иметь значения разных типов.

Список может работать как стек или очередь.

Способы создания списков

Самый простой:


my_list_1 = []

На базе нескольких существующих элементов:


my_list_2 = [False, 1, 2.0, 'с']  # элементы списка могут быть разного типа

С помощью конструктора класса:


my_list_3 = list()

На базе коллекции (строка, кортеж, множество, диапазон и т.п.):


my_list_4 = list('Hello')  # ['H', 'e', 'l', 'l', 'o']

my_list_5 = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Генераторные выражения:


my_list_6 = [elem ** 2 for elem in range(10)]
my_list_7 = [elem ** 2 for elem in range(10) if elem % 2 == 0]
my_list_8 = [(x, y) for x in range(10) for y in range(10)]

Операторы

Доступ к элементам списка осуществляется с помощью оператора [] по индексу (номеру элемента).

Нумерация элементов в списке начинается с нуля!

Отрицательные индексы отсчитываются от конца списка (последний -1, предпоследний -2 и т.д.).

Перезапись и чтение значений списка по индексу:


my_list_2[0] = 'new value'
print(my_list_2[-1])  # печать последнего элемента из списка

Проверка на присутствие или отсутствие элемента в списке (см. PEP8):


elem = 5
if elem in my_list:
    print('The element belongs to the list')

# Рекомендуемый вариант (используется оператор not in):
if elem not in my_list:
    print('The element does not belong to the list')

# Нерекомендуемый вариант (используются два оператора: not и in):
if not elem in my_list:
    print('The element does not belong to the list')

Поэлементное (лексикографическое) сравнение двух списков:


if list1 == list2:
    print('The lists are equal')
if list1 != list2:
    print('The lists are not equal')
if list1 > list2:
    print('The first list is greater than the second')
if list1 >= list2:
    print('The first list is greater than or equal to the second')
if list1 < list2:
    print('The first list is lesser than the second')
if list1 <= list2:
    print('The first list is lesser than or equal to the second')

Проверка двух списков на идентичность (см. PEP8):


if list1 is list2:
    print('these two variables are the same object!')

# Рекомендуемый вариант (используется оператор is not):
if list1 is not list2:
    print('different objects')

# Нерекомендуемый вариант (используются два оператора: not и is):
if not list1 is list2:
    print('different objects')

Обход элементов списка

Нерекомендуемый способ обхода списка, основанный на механическом повторении синтаксиса других языков:


for i in range(len(my_list)):
    print(my_list[i])

Рекомендуемый способ обхода списка:


for elem in my_list:
    print(elem)

Если в теле цикла вам одновременно нужны индекс и значение элемента списка, используйте функцию enumerate():


for i, value in enumerate(my_list):
    print(i, value)

Если вам нужно обойти список в обратном порядке:


for elem in reversed(my_list):
    print(elem)

Добавление элемента в список

Добавление элемента в конец списка:


new_elem = int(input())
my_list.append(new_elem)

Вставка элемента в заданную позицию списка:


# new_elem станет третьим в списке
my_list.insert(2, new_elem)

Добавление в список всех элементов из другого списка:


my_list.extend(another_list)

Создание нового списка в результате слияния (конкатенации) двух списков:


new_list = my_list_1 + my_list_2

Поиск элемента в списке

Поиск индекса (номера) первого вхождения элемента в список (если элемент отсутствует — будет ошибка ValueError):


i = my_list.index(elem)

Подсчёт количества повторов элемента в списке:


num = my_list.count(elem)

Удаление элементов из списка

Удалить элемент из списка по индексу (номеру):


# будет удален элемент с индексом 0
del my_list[0]

Удалить элемент из списка по значению (если элемент отсутствует — будет ошибка ValueError):


my_list.remove(elem)

Очистка списка:


my_list.clear()

Другие операции

Извлечение элемента из конца списка (элемент удаляется из списка):


last_element = my_list.pop()

Извлечение элемента из середины списка (элемент удаляется из списка):


third_element = my_list.pop(2)

Создание копии (shallow copy) списка:


new_list = my_list.copy()

Создание полной копии списка (применяется когда элементами списка являются другие списки, словари или множества):


from copy import deepcopy
new_list = deepcopy(my_list)

Создание нового списка путем повтора исходного списка несколько раз:


my_list = [0]
new_list = my_list * 5  # [0, 0, 0, 0, 0]

Встроенные функции

Количество элементов в списке:


len(my_list)

Сумма элементов списка:


sum(my_list)

Максимальный элемент списка:


max(my_list)

Минимальный элемент списка:


min(my_list)

Проверка, что в списке есть непустые (ненулевые) элементы:


any(my_list)

Проверка, что все элементы в списке — непустые (ненулевые):


all(my_list)

## Срезы

Чтобы получить из списка элементы начиная с индекса 1 до 3 (не включая его):


my_list = [10, 20, 30, 40, 50, 60]
new_list = my_list[1:3]  # [20, 30]

Отрицательные индексы позволяют отсчитывать элементы от конца списка. Чтобы получить из списка элементы начиная с индекса 1 до предпоследнего (не включая его):


my_list = [10, 20, 30, 40, 50, 60]
new_list = my_list[1:-2]  # [20, 30, 40]

Чтобы получить из списка элементы начиная с индекса 1 до конца списка:


my_list = [10, 20, 30, 40, 50, 60]
new_list = my_list[1:]  # [20, 30, 40, 50, 60]

Чтобы получить из списка элементы от его начала до индекса 3 (не включая его):


my_list = [10, 20, 30, 40, 50, 60]
new_list = my_list[:3]  # [10, 20, 30]

Чтобы получить копию списка:


my_list = [10, 20, 30, 40, 50, 60]
new_list = my_list[:]  # [10, 20, 30, 40, 50, 60]

Чтобы получить из списка элементы с индекса 1 до 10 (не включая его) с шагом 2:


my_list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
new_list = my_list[1:10:2]  # [20, 40, 60, 80, 100]

Чтобы получить из списка элементы с индекса 1 до конца строки с шагом 2:


my_list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
new_list = my_list[1::2]  # [20, 40, 60, 80, 100, 120]

Отрицательный шаг позволяет обходить элементы в обратном порядке. Чтобы получить из списка элементы с индекса 4 до 1 (не включая его) в обратном порядке:


my_list = [10, 20, 30, 40, 50, 60]
new_list = my_list[4:1:-1]  # [50, 40, 30]

Чтобы получить из списка элементы от начала до конца строки с шагом -2:


my_list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
new_list = my_list[::-2]  # [120, 100, 80, 60, 40, 20]

Срез можно сохранить в переменную, передать в функцию или получить из функции: 


my_list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
my_slice = slice(1, 10, 2)
new_list = my_list[my_slice]  # [20, 40, 60, 80, 100]

Сортировка списков

Сортировка списка (in-place):


my_list.sort()

Сортировка списка в убывающем порядке (in-place):


my_list.sort(reverse=True)

Создание отсортированной копии списка:


new_list = sorted(my_list)

Создание отсортированной в убывающем порядке копии списка:


new_list = sorted(my_list, reverse=True)

При сортировке можно указать параметр key, который позволяет задать функцию преобразования элементов при их сравнении. Отметим, что элементы списка при этом остаются прежними:


# Пример сортировки строк по их длине, а не значению:
words = ['abc', 'bc', 'c']
words.sort(key=len)  # перед сравнением строк будет вычислятся их длина
print(words)  # ['c', 'bc', 'abc']