Список как структура данных в Python: от простого к сложному

Раздел: Основы 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))  # 1

Python пар (пары (ключ-значение) в python)

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

print(lst.count(20))  # 2

Python разница списков (разница между списками и кортежами в 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]

Списки в Python - comments

En
списки в языке python (python)