Список list в Python: что это и как с этим работать

Список (list) - это один из самых часто используемых контейнеров в Python, который позволяет хранить много данных одновременно.

Иллюстрация списка в Python

Как создать список (list) в Python

Мы можем создать список просто обернув значения в квадратные скобки []:

ages = [10, 40, 20]

print(ages)

Вывод:

[10, 40, 20]

Тут мы создали список из трех элементов: 10, 40 и 20.

В списке мы можем хранить элементы любого типа, не только числа:

# разные типы в одном списке
list_a = [1, "два", 3]

# список с одинаковыми значениями
list_b = [1, 1, 2, 1]

# пустой список
list_c = []

Конструктор list

Конструктор list позволяет создать список без использования квадратных скобок из существующей последовательности любого типа:

# пустой список
empty_list = list()

# список символов
char_list = list("абв")

print(char_list)

Вывод:

['а', 'б', 'в']

Давайте попробуем создать список чисел с помощью функции range:

numbers = list(range(1, 10, 3))

print(numbers)

Вывод:

[1, 4, 7]

Получение элемента из списка по индексу

Python list index

Чтобы получить элемент из списка, мы можем указать номер нужного элемента в квадратных скобках [<номер>]:

l = ["ноль", "один", "два"]
item = l[2]

print(item)

Вывод:

два

Как поменять элемент в списке

Чтобы поменять элемент в списке, мы можем указать новое значение элемента по индексу после знака равно =:

numbers = [1, 2, 3]
print('до:   ', numbers)

numbers[1] = 9
print('после:', numbers)

Вывод:

до:    [1, 2, 3]
после: [1, 9, 3]

Как получить длину списка

Для получения длины списка в Python есть специальная функция - len. Ей нужно передать объект типа list, и она вернет количество элементов в нем:

numbers = [1, 2, 3, 4]

print('len:', len(numbers))

Вывод:

len: 4

Отрицательный индекс

Python list index

Python позволяет нам получить номер элемента с конца при помощи отрицательного индекса:

ages = [18, 24, 31]

print('последний:    ', ages[-1])
print('предпоследний:', ages[-2])

Вывод:

последний:     31
предпоследний: 24

Цикл for для списков

Python позволяет нам использовать цикл for вместе со списками. Для этого просто нужно указать список после ключевого слова in:

students = ["Вася", "Маша", "Петя"]

for student in students:
  print(student)

Вывод:

Вася
Маша
Петя

Список списков

Можно хранить список списков любой вложенности:

matrix = [
  [0, 1, 0],
  [0, 2, 0],
  [0, 0, 0],
]

# получить элемент
print("matrix[0][1] =", matrix[0][1])

# изменить элемент
matrix[2][2] = 2
print(matrix)

Вывод:

matrix[0][1] = 1
[[0, 1, 0], [0, 2, 0], [0, 0, 2]]

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

Мы разобрались, как создать список и изменить его отдельные элементы. Но как нам добавить элементы в уже существующий список? У типа list есть несколько очень удобных методов для этого.

list.append

Метод .append(item) позволяет добавить один элемент в конец списка:

l = [0, 1, 2]
l.append(3)
print(l)

Вывод:

[0, 1, 2, 3]

list.extend

Если мы хотим добавить сразу несколько элементов в конец, то мы можем воспользоваться методом .extend(items):

a = [0, 1, 2]
b = [3, 4]
a.extend(b)
print(a)

Вывод:

[0, 1, 2, 3, 4]

list.insert

Если нужно вставить элемент в середину списка, то .insert(item) — это наш выбор:

l = [3, 1, 0]
# вставить 2 по индексу 1
l.insert(1, 2)
print(l)

Вывод:

[3, 2, 1, 0]

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

Теперь, когда мы научились добавлять элементы в существующий список, давайте научимся и удалять. Для этого у типа list тоже есть есть несколько методов, но начнем мы со специального ключевого слова del.

Ключевое слово del

Python позволяет удалить любой элемент из списка по индексу с помощью del:

l = [0, -3, 1]
del l[1]
print(l)

Вывод:

[0, 1]

list.remove

Метод .remove(value) удаляет первое вхождение элемента в списке:

l = [1, -3, 2, -3]
l.remove(-3)
print(l)

Вывод:

[1, 2, -3]

list.pop

Метод .pop(index=-1) удаляет элемент на указанной позиции из списка и возвращает удаленное значение:

l = [1, -3, 2, -4]

# по умолчанию удаляется последний элемент
print("pop:", l.pop(), "  l:", l)

# тут мы удаляем второй элемент из списка
print("pop:", l.pop(1), "  l:", l)

Вывод:

pop: -4   l: [1, -3, 2]
pop: -3   l: [1, 2]

list.clear

Метод .clear() удаляет все элементы из списка:

l = [1, 2, 3]
l.clear()

print(l)

Вывод:

[]

Получение части (среза) списка

В Python существует элегантный механизм для получения определенной части списка. Чтобы получить срез, используйте [<начало>:<конец>:<шаг>].

Элемент с индексом <конец> не будет включен в срез. Начало, конец и шаг можно не указывать:

l = [0, 1, 2, 3, 4]

# тут срез будет равен всему списку
print("l[:]     =", l)

# тут мы берем элементы 1, 2 (конец не включается)
print("l[1:3]   =", l[1:3])

# тут мы берем все элементы начиная с первого
print("l[1:]    =", l[1:])

# можно использовать отрицательные индексы
# тут мы берем все элементы начиная с предпоследнего
print("l[-2:]   =", l[-2:])

# тут мы берем элементы с нулевого по третий через один
print("l[0:3:2] =", l[0:3:2])

# тут мы разворачиваем массив
print("l[::-1]  =", l[::-1])
l[:]     = [0, 1, 2, 3, 4]
l[1:3]   = [1, 2]
l[1:]    = [1, 2, 3, 4]
l[-2:]   = [3, 4]
l[0:3:2] = [0, 2]
l[::-1]  = [4, 3, 2, 1, 0]

Срезы также можно использовать, чтобы менять список:

l = [0, 1, 2, 3, 4]
print("создали: ", l)

l[1:3] = [9, 8, 7]
print("поменяли:", l)

l[1:4] = []
print("удалили: ", l)

Вывод:

создали:  [0, 1, 2, 3, 4]
поменяли: [0, 9, 8, 7, 3, 4]
удалили:  [0, 3, 4]

Срезы - это очень удобный инструмент при работе со списками. Я рекомендую разобраться с ними. Это сильно поможет вам в дальнейшем.

Поиск значений в списке

Давайте теперь посмотрим на то, как мы можем искать элементы в списке.

Ключевое слово in

Конструкция вида value in [1, 2, 3] вернет True, если value присутствует в списке:

l = [1, 2, 3]
print("2 in l:", 2 in l)
print("5 in l:", 5 in l)

Вывод:

2 in l: True
5 in l: False

list.index

Метод .index(value) возвращает индекс первого элемента, который равен искомому значению. Если элемент найти не удалось, то index вернет ошибку:

l = [1, 2, 3, 2]
print("l.index(2):", l.index(2))
print()

l.index(5) # <- ошибка

Вывод:

l.index(2): 1

Traceback (most recent call last):
  ...
ValueError: 5 is not in list

Если мы хотим найти элемент только в части списка, то мы можем передать аргументы start и end:

l = [1, 2, 3, 2, 5, 6]
# найти значение 2 с третьего элемента по пятый (не включительно)
print(l.index(2, 2, 4))

Вывод:

3

Как вы можете видеть, метод index вернул позицию второй двойки.

list.count

Метод .count(value) можно использовать для подсчета количества определенных элементов в списке:

l = [1, 2, 3, 2, 3]
print(l.count(3))

Вывод:

2

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

Для сортировки списка можно воспользоваться методом .sort():

l = [3, 2, 4, 1]
l.sort()
print(l)

Вывод:

[1, 2, 3, 4]

Если нам нужно отсортировать элементы по убыванию, то мы можем указать reverse=True:

l = [3, 2, 4, 1]
l.sort(reverse=True)
print(l)

Вывод:

[4, 3, 2, 1]

Мы также можем поменять значение, по которому будут сортироваться элементы в списке:

l = ["один", "два", "десять"]
l.sort()
print("обычный sort:", l)

# тут мы сортируем по длине
l.sort(key=len)
print("key sort:    ", l)

Вывод:

обычный sort: ['два', 'десять', 'один']
key sort:     ['два', 'один', 'десять']

Разворот списка

Мы уже видели, что мы можем получить элементы в обратном порядке при помощи среза с отрицательным шагом:

l = [1, 2, 3]
print(l[::-1])

Вывод:

[3, 2, 1]

Но в Python можно развернуть список без использования среза. Для этого нужно воспользоваться методом .reverse():

l = [1, 2, 3]
l.reverse()
print(l)

Вывод:

[3, 2, 1]

Создание копии списка

Как и в случае с разворотом, мы можем воспользоваться срезами для создания копии:

a = [1, 2, 3]
b = a[:]
a[1] = 0

print("a:", a)
print("b:", b)

Вывод:

a: [1, 0, 3]
b: [1, 2, 3]

Но если вы не хотите использовать срезы, то можно создать копию при помощи метода .copy():

a = [1, 2, 3]
b = a.copy()
a[1] = 0

print("a:", a)
print("b:", b)

Вывод идентичен предыдущему:

a: [1, 0, 3]
b: [1, 2, 3]

Генератор списков в Python

В Python есть очень удобный синтаксис для того, чтобы создавать списки по определенным условиям. Выглядят эти генераторы следующим образом:

# простой генератор
print("1.", [x for x in range(0, 3)])

# генератор с фильтрацией
print("2.", [x for x in range(0, 3) if x % 2 == 0])

# генератор с изменением элемента
print("3.", [x * 2 for x in range(0, 3)])

# генератор с двойным циклом
print("4.", [i * j for i in [1, 2] for j in range(1, 3)])

Вывод:

1. [0, 1, 2]
2. [0, 2]
3. [0, 2, 4]
4. [1, 2, 2, 4]

Разложение списков

В Python можно разложить список на отдельные значения. Для этого нужно слева от знака равно указать переменные, в которые будут записаны элементы списка:

a, b, c = [1, 2, 3]

print("sum:", a + b + c)

Вывод:

sum: 6

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

a, b = [1, 2, 3, 4, 5]

Ошибка:

Traceback (most recent call last):
  ...
ValueError: too many values to unpack (expected 2)

Функция type для списков

Если вам нужно проверить, что в переменной хранится список, то вы можете воспользоваться функцией type:

number = 1
l = [1, 2, 3]

print("number is a list:", type(number) == list)
print("l is a list:     ", type(l) == list)

Вывод:

number is a list: False
l is a list:      True

Сложение списков

В Python’е можно объединить два списка при помощи оператора сложения +:

a = [1, 2, 3]
b = [4, 5, 6]
print(a + b)

Вывод:

[1, 2, 3, 4, 5, 6]

Умножение списков

Часто бывает удобно создать список, в котором значения будут повторяться. Для этого можно умножить список на число:

a = [1, 2]
b = a * 3
print(b)

Вывод:

[1, 2, 1, 2, 1, 2]

Сравнение списков

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

a = [1, 2, 3]
b = [1, 2, 3]
c = [3, 2, 1]

print("a == b:", a == b)
print("b == c:", b == c)

Вывод:

a == b: True
b == c: False

Упражнения

  1. Создание и вывод списка:
    Напишите программу на Python, которая позволяет пользователю вводить данные до тех пор, пока он не введет слово “стоп”. Все введенные данные должны сохраняться в списке. После ввода слова “стоп”, программа должна выводить весь список.
  2. Манипуляции со списком:
    Напишите программу, которая просит пользователя ввести 5 чисел. Сохраните эти числа в список, а затем выведите на экран максимальное, минимальное число и среднее арифметическое всех чисел в списке.
  3. Операции со списками:
    Создайте два списка: один со строками, а другой со числами. Напишите программу, которая объединяет эти списки в один и выводит результат. Попробуйте использовать методы, такие как append и extend, и посмотрите, как они влияют на результат.

Обсуждение