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

Python предоставляет встроенные типы данных для работы с наборами элементов: списки, кортежи и словари.
В этом материале рассмотрим подробно списки (list).


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

Список — это упорядоченная коллекция элементов, которая может хранить объекты разных типов.

Синтаксис

Для создания списка используются квадратные скобки [], а элементы разделяются запятыми.

numbers = [1, 2, 3, 4, 5]
people = ["Tom", "Sam", "Bob"]

Пустой список

Можно создать пустой список двумя способами:

numbers1 = []
numbers2 = list()

Оба варианта эквивалентны.

Список с разными типами данных

Список может содержать элементы различных типов:

objects = [1, 2.6, "Hello", True]

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

Функция list() создаёт список на основе переданной последовательности:

numbers1 = [1, 2, 3, 4, 5]
numbers2 = list(numbers1)        # Копия списка
print(numbers2)                  # [1, 2, 3, 4, 5]
 
letters = list("Hello")
print(letters)                   # ['H', 'e', 'l', 'l', 'o']

Обращение к элементам списка

Элементы списка индексируются с нуля. Также можно использовать отрицательные индексы (отсчёт с конца).

people = ["Tom", "Sam", "Bob"]
 
# Обращение по индексу с начала
print(people[0])   # Tom
print(people[1])   # Sam
print(people[2])   # Bob
 
# Обращение по индексу с конца
print(people[-1])  # Bob
print(people[-2])  # Sam
print(people[-3])  # Tom

Изменение элемента

Простое присваивание по индексу позволяет изменить элемент:

people = ["Tom", "Sam", "Bob"]
people[1] = "Mike"
print(people)      # ["Tom", "Mike", "Bob"]

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

Можно распаковать список в переменные:

people = ["Tom", "Bob", "Sam"]
tom, bob, sam = people
 
print(tom)         # Tom
print(bob)         # Bob
print(sam)         # Sam

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

Через цикл for

people = ["Tom", "Sam", "Bob"]
for person in people:
    print(person)

Через цикл while

people = ["Tom", "Sam", "Bob"]
i = 0
while i < len(people):
    print(people[i])
    i += 1

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

Два списка считаются равными, если они содержат одинаковые элементы в одинаковом порядке:

numbers1 = [1, 2, 3, 4, 5]
numbers2 = list([1, 2, 3, 4, 5])
 
if numbers1 == numbers2:
    print("numbers1 equal to numbers2")
else:
    print("numbers1 is not equal to numbers2")

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

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

  • list[:end] — от начала до end (не включая)
  • list[start:end] — от start до end
  • list[start:end:step] — с шагом step
people = ["Tom", "Bob", "Alice", "Sam", "Tim", "Bill"]
 
slice_people1 = people[:3]           # ["Tom", "Bob", "Alice"]
slice_people2 = people[1:3]          # ["Bob", "Alice"]
slice_people3 = people[1:6:2]        # ["Bob", "Sam", "Bill"]

Отрицательные индексы в срезах

slice_people1 = people[:-1]          # ["Tom", "Bob", "Alice", "Sam", "Tim"]
slice_people2 = people[-3:-1]        # ["Sam", "Tim"]

Основные методы и функции списков

Метод / ФункцияОписание
append(item)Добавляет элемент в конец списка
insert(index, item)Вставляет элемент по указанному индексу
extend(items)Добавляет несколько элементов из итерируемого объекта
remove(item)Удаляет первое вхождение элемента (ошибка, если не найден)
clear()Удаляет все элементы
index(item)Возвращает индекс первого вхождения (ошибка, если не найден)
pop([index])Удаляет и возвращает элемент по индексу (по умолчанию — последний)
count(item)Возвращает количество вхождений элемента
sort([key])Сортирует список по возрастанию
reverse()Разворачивает список
copy()Возвращает поверхностную копию списка

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

ФункцияОписание
len(list)Длина списка
sorted(list, [key])Возвращает новый отсортированный список
min(list)Наименьший элемент
max(list)Наибольший элемент

Добавление и удаление элементов

Пример использования основных методов:

people = ["Tom", "Bob"]
 
people.append("Alice")               # ["Tom", "Bob", "Alice"]
people.insert(1, "Bill")             # ["Tom", "Bill", "Bob", "Alice"]
people.extend(["Mike", "Sam"])       # ["Tom", "Bill", "Bob", "Alice", "Mike", "Sam"]
 
index_of_tom = people.index("Tom")
removed_item = people.pop(index_of_tom)  # ["Bill", "Bob", "Alice", "Mike", "Sam"]
last_item = people.pop()                 # ["Bill", "Bob", "Alice", "Mike"]
people.remove("Alice")                   # ["Bill", "Bob", "Mike"]
 
print(people)                            # ["Bill", "Bob", "Mike"]
 
people.clear()
print(people)                            # []

Проверка наличия элемента

Чтобы избежать ошибок при удалении или поиске, используйте оператор in:

people = ["Tom", "Bob", "Alice", "Sam"]
 
if "Alice" in people:
    people.remove("Alice")
 
print(people)   # ["Tom", "Bob", "Sam"]

Удаление с помощью del

Оператор del позволяет удалять элементы или срезы:

people = ["Tom", "Bob", "Alice", "Sam", "Bill", "Kate", "Mike"]
 
del people[1]            # ["Tom", "Alice", "Sam", "Bill", "Kate", "Mike"]
del people[:3]           # ["Bill", "Kate", "Mike"]
del people[1:]           # ["Bill"]
 
print(people)

Изменение подсписка

Можно заменить часть списка новыми элементами:

nums = [10, 20, 30, 40, 50]
nums[1:4] = [11, 22]
print(nums)   # [10, 11, 22, 50]

Подсчёт вхождений

Метод count() возвращает количество вхождений элемента:

people = ["Tom", "Bob", "Alice", "Tom", "Bill", "Tom"]
people_count = people.count("Tom")
print(people_count)   # 3

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

По возрастанию

people = ["Tom", "Bob", "Alice", "Sam", "Bill"]
people.sort()
print(people)   # ["Alice", "Bill", "Bob", "Sam", "Tom"]

По убыванию

people.sort()
people.reverse()
print(people)   # ["Tom", "Sam", "Bob", "Bill", "Alice"]

Сортировка без учёта регистра

people = ["Tom", "bob", "alice", "Sam", "Bill"]
people.sort(key=str.lower)
print(people)   # ["alice", "Bill", "bob", "Sam", "Tom"]

Функция sorted()

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

people = ["Tom", "bob", "alice", "Sam", "Bill"]
sorted_people = sorted(people, key=str.lower)
print(sorted_people)   # ["alice", "Bill", "bob", "Sam", "Tom"]

Фильтрация списка

Функция filter() применяет условие к каждому элементу.

Пример: числа больше 1

numbers = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
 
def condition(number):
    return number > 1
 
result = filter(condition, numbers)
for n in result:
    print(n, end=" ")   # 2 3 4 5

С лямбда-выражением

result = filter(lambda n: n > 1, numbers)
for n in result:
    print(n, end=" ")   # 2 3 4 5

Фильтрация объектов

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
people = [
    Person("Tom", 38),
    Person("Kate", 31),
    Person("Bob", 42),
    Person("Alice", 34),
    Person("Sam", 25)
]
 
# Выбираем людей старше 33 лет
view = filter(lambda p: p.age > 33, people)
for person in view:
    print(f"Name: {person.name}, Age: {person.age}")