Список как структура данных в Python: от простого к сложному
Основы работы со списками в Python
Список (list) в Python это изменяемая упорядоченная коллекция элементов. Самый эффективный способ создать список явное перечисление элементов в квадратных скобках:
my_list = [1, 2, 3, 'a', 'b', True]значения списка числа python (итерация по значениям списка чисел в python)
Индексация начинается с нуля. Отрицательные индексы отсчитывают с конца:
print(my_list[0]) # 1
print(my_list[-1]) # Trueсловарь set python (словарь и set в python)
Срезы позволяют получить подсписок:
print(my_list[1:4]) # [2, 3, 'a']
print(my_list[::-1]) # [True, 'b', 'a', 3, 2, 1]
Python dict set (словарь и множество в python)
Типичные проблемы:
- IndexError при обращении к несуществующему индексу. Решение: проверять длину len() или использовать try-except.
- Путаница между срезом и копией: my_list[:] создаёт поверхностную копию, а не ссылку.
Как добавить элементы в список?
append добавляет один элемент в конец:
lst = [1, 2]
lst.append(3)
print(lst) # [1, 2, 3]типы структур python (типы структур данных в python)
extend добавляет все элементы итерируемого объекта:
lst.extend([4, 5])
print(lst) # [1, 2, 3, 4, 5]вложенные структуры данных в python (вложенные структуры данных в python)
insert вставляет элемент по индексу:
lst.insert(0, 0)
print(lst) # [0, 1, 2, 3, 4, 5]кортеж чисел python (кортеж чисел в python)
Типичная ошибка:
Использование append для добавления нескольких элементов: lst.append([4,5]) добавит вложенный список, а не числа. Решение: использовать extend или цикл.
Как удалить элементы из списка?
remove удаляет первое вхождение значения:
lst = [1, 2, 3, 2]
lst.remove(2)
print(lst) # [1, 3, 2]язык программирования python массивы (массивы (списки) в python)
pop удаляет по индексу и возвращает элемент (по умолчанию последний):
last = lst.pop()
print(last, lst) # 2 [1, 3]массивы данных python 3 (массивы данных в python)
del удаляет элемент или срез:
del lst[0]
print(lst) # [3]одномерные массивы на языке программирования python (одномерные массивы в python)
clear очищает список:
lst.clear()
print(lst) # []последовательности в python и способы их реализации (последовательности в python и способы их реализации)
Проблемы:
- remove вызывает ValueError, если элемент не найден. Решение: проверять вхождение через in.
- pop и del с несуществующим индексом вызывают IndexError.
Как найти элемент или проверить его наличие?
in проверяет наличие:
print(3 in [1, 2, 3]) # Trueпрограммы с массивами на python (программы с массивами на python)
index возвращает индекс первого вхождения:
lst = [10, 20, 30, 20]
print(lst.index(20)) # 1Python пар (пары (ключ-значение) в python)
count возвращает количество вхождений:
print(lst.count(20)) # 2Python разница списков (разница между списками и кортежами в python)
Ошибка:
index вызывает ValueError, если элемент отсутствует. Решение: использовать try-except или проверять через in.
Как упорядочить элементы?
sort сортирует список на месте (изменяет исходный):
nums = [3, 1, 2]
nums.sort()
print(nums) # [1, 2, 3]как сделать массив python (создание массива (списка) в python)
sorted возвращает новый отсортированный список:
nums = [3, 1, 2]
sorted_nums = sorted(nums)
print(sorted_nums) # [1, 2, 3]
print(nums) # [3, 1, 2]списки в языке python (списки в python)
reverse переворачивает список на месте:
nums.reverse()
print(nums) # [2, 1, 3]упорядоченные структуры данных в python (упорядоченные структуры данных в python)
Проблемы:
- sort и sorted требуют сравнимых типов данных. Смесь int и str вызовет TypeError.
- reverse изменяет исходный список, что может быть неожиданно.
Как создать новый список на основе существующего?
Списковое включение (list comprehension) это компактный и эффективный способ:
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]Python массив int (массив целых чисел в python)
С условием:
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]Python набор значений (множество (set) значений в python)
Функциональный подход map/filter:
squares_map = list(map(lambda x: x**2, range(10)))
print(squares_map) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Типичная ошибка:
Попытка изменить исходный список во время итерации по нему. Решение: создавать копию или использовать списковое включение.
Как скопировать список?
Поверхностное копирование создаёт независимый список, но вложенные объекты остаются общими:
original = [1, [2, 3]]
shallow = original.copy()
shallow[1].append(4)
print(original) # [1, [2, 3, 4]]
Глубокое копирование с модулем copy:
import copy
deep = copy.deepcopy(original)
deep[1].append(5)
print(original) # [1, [2, 3, 4]]
print(deep) # [1, [2, 3, 4, 5]]
Проблема:
Присваивание (new = original) не создаёт копию, а только новую ссылку на тот же список. Изменения через одну переменную отразятся на другой.
Как работать с многомерными списками?
Вложенные списки (списки списков) образуют матрицы или таблицы:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[1][2]) # 6
Обход всех элементов двухуровневого списка:
for row in matrix:
for val in row:
print(val, end=' ')
# вывод: 1 2 3 4 5 6 7 8 9
Ошибка:
Создание матрицы через [[0]*3]*3 приводит к копированию ссылок на одну строку. Решение: использовать [[0]*3 for _ in range(3)].
Расширенные примеры работы со списками
1. Сортировка с пользовательским ключом
words = ['apple', 'banana', 'cherry', 'date']
words.sort(key=len)
print(words) # ['date', 'apple', 'banana', 'cherry']
# Сортировка по последней букве
words.sort(key=lambda w: w[-1])
print(words) # ['banana', 'date', 'apple', 'cherry']
['date', 'apple', 'banana', 'cherry'] ['banana', 'date', 'apple', 'cherry']
2. Списковое включение с несколькими условиями и вложенными циклами
# Таблица умножения 3x3
table = [[i*j for j in range(1, 4)] for i in range(1, 4)]
print(table) # [[1, 2, 3], [2, 4, 6], [3, 6, 9]]
[[1, 2, 3], [2, 4, 6], [3, 6, 9]]
3. Параллельный обход с zip и enumerate
names = ['Alice', 'Bob', 'Charlie']
scores = [85, 92, 78]
for idx, (name, score) in enumerate(zip(names, scores), start=1):
print(f'{idx}. {name}: {score}')
# Вывод:
# 1. Alice: 85
# 2. Bob: 92
# 3. Charlie: 78
1. Alice: 85 2. Bob: 92 3. Charlie: 78
4. Распаковка списка с звёздочкой
head, *mid, tail = [1, 2, 3, 4, 5]
print(head) # 1
print(mid) # [2, 3, 4]
print(tail) # 5
1 [2, 3, 4] 5
5. Безопасное изменение списка во время итерации
lst = [1, 2, 3, 4, 5]
# Удаление чётных чисел, итерируясь по копии
for val in lst[:]:
if val % 2 == 0:
lst.remove(val)
print(lst) # [1, 3, 5]
[1, 3, 5]
6. Глубокое копирование вложенных структур
import copy
nested = [ [1, 2], [3, 4] ]
deep = copy.deepcopy(nested)
deep[0][0] = 99
print(nested) # [[1, 2], [3, 4]]
print(deep) # [[99, 2], [3, 4]]
[[1, 2], [3, 4]] [[99, 2], [3, 4]]
7. Использование deque как альтернативы списку для операций с обоих концов
from collections import deque
dq = deque([1, 2, 3])
dq.appendleft(0)
dq.append(4)
print(dq) # deque([0, 1, 2, 3, 4])
print(list(dq)) # [0, 1, 2, 3, 4]
deque([0, 1, 2, 3, 4]) [0, 1, 2, 3, 4]