Список (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']