Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Добавление элемента в List
Операция добавления элемента в список (List) — одна из базовых операций структур данных. Её реализация и сложность зависят от типа списка.
В Python
Встроенный метод append():
my_list = [1, 2, 3]
my_list.append(4) # Добавляет элемент в конец
print(my_list) # [1, 2, 3, 4]
# Временная сложность: O(1) amortized
# В среднем операция требует постоянного времени
Другие методы добавления:
my_list = [1, 2, 3]
# insert() - добавить в конкретную позицию
my_list.insert(1, 99) # [1, 99, 2, 3]
# Сложность: O(n) - требует сдвига элементов
# extend() - добавить несколько элементов
my_list.extend([4, 5, 6]) # [1, 99, 2, 3, 4, 5, 6]
# Сложность: O(k) где k - количество добавляемых элементов
# += оператор
my_list += [7, 8]
# Эквивалентно extend()
Реализация динамического массива
Внутри Python list — это динамический массив. Когда запасное место кончается, происходит перераспределение:
# Внутренняя реализация (упрощённо)
class DynamicList:
def __init__(self):
self.items = [None] * 10 # Начальная ёмкость
self.count = 0 # Количество элементов
def append(self, value):
# Если нет свободного места
if self.count == len(self.items):
# Увеличиваем ёмкость (обычно в 1.5-2 раза)
new_capacity = len(self.items) * 2
new_items = [None] * new_capacity
# Копируем старые элементы
for i in range(self.count):
new_items[i] = self.items[i]
self.items = new_items
# Добавляем новый элемент
self.items[self.count] = value
self.count += 1
Сложность операций
| Операция | Сложность | Описание |
|---|---|---|
append() | O(1)* | В среднем добавление в конец |
insert(i, x) | O(n) | Требует сдвига элементов |
pop() | O(1) | Удаление с конца |
pop(i) | O(n) | Удаление из середины |
del list[i] | O(n) | Удаление по индексу |
list[i] | O(1) | Доступ по индексу |
search(x) | O(n) | Поиск элемента |
*O(1) amortized - в среднем O(1), но иногда O(n) когда нужна переаллокация
Связный список (Linked List)
В отличие от массива, в связном списке добавление проще:
class Node:
def __init__(self, value):
self.value = value
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def append(self, value):
"""Добавить элемент в конец"""
new_node = Node(value)
if not self.head:
self.head = new_node
return
# Идём до конца списка
current = self.head
while current.next:
current = current.next
current.next = new_node
# Сложность: O(n) - нужно пройти весь список
def prepend(self, value):
"""Добавить элемент в начало"""
new_node = Node(value)
new_node.next = self.head
self.head = new_node
# Сложность: O(1) - очень быстро
def insert_after(self, prev_node, value):
"""Добавить элемент после известного узла"""
if not prev_node:
return
new_node = Node(value)
new_node.next = prev_node.next
prev_node.next = new_node
# Сложность: O(1) - если найден узел
Сравнение типов списков
| Операция | Array List | Linked List |
|---|---|---|
append() | O(1)* | O(n) |
prepend() | O(n) | O(1) |
insert(i) | O(n) | O(1)** |
| Доступ по индексу | O(1) | O(n) |
| Поиск | O(n) | O(n) |
| Память | Компактна | Больше (указатели) |
*если место есть. **если узел известен
Очередь и Стек
Очередь (Queue) — FIFO:
from collections import deque
queue = deque()
queue.append(1) # Добавить в конец: O(1)
queue.append(2)
queue.append(3)
first = queue.popleft() # Удалить с начала: O(1)
print(first) # 1
Стек (Stack) — LIFO:
stack = []
stack.append(1) # Добавить: O(1)
stack.append(2)
stack.append(3)
last = stack.pop() # Удалить последний: O(1)
print(last) # 3
Best Practices при добавлении элементов
- Используй append() для конца списка — это всегда O(1)
- Избегай insert() в середину в цикле — O(n²) сложность
- Используй extend() для добавления группы — быстрее чем цикл append()
- Если часто добавляешь в начало — используй deque или linked list
- Для больших данных рассмотри специализированные структуры (heap, tree)
# ❌ Плохо - O(n²)
result = []
for i in range(1000):
result.insert(0, i) # Каждый раз сдвигаются все элементы
# ✅ Хорошо - O(n)
result = deque()
for i in range(1000):
result.appendleft(i) # O(1) в deque
# ✅ Также хорошо - O(n)
result = list(range(1000))[::-1] # Развернуть в конце
Выбор типа списка и метода добавления критичен для производительности при работе с большими объёмами данных в Data Engineering.