Работа со списками в 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доendlist[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}")