← Назад к вопросам

Как добавляется элемент в List?

1.0 Junior🔥 191 комментариев
#Python

Комментарии (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 ListLinked 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 при добавлении элементов

  1. Используй append() для конца списка — это всегда O(1)
  2. Избегай insert() в середину в цикле — O(n²) сложность
  3. Используй extend() для добавления группы — быстрее чем цикл append()
  4. Если часто добавляешь в начало — используй deque или linked list
  5. Для больших данных рассмотри специализированные структуры (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.

Как добавляется элемент в List? | PrepBro