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

В чём разница между словарем и списком?

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

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между словарём и списком в Python

Это две фундаментальные структуры данных в Python, и выбор между ними влияет на производительность и удобство кода.

Что такое список?

Список - это упорядоченная коллекция элементов, индексируемая по позиции (0, 1, 2, ...).

# Создание списка
my_list = [1, 2, 3, 4, 5]
print(my_list)              # [1, 2, 3, 4, 5]

# Доступ по индексу
print(my_list[0])          # 1
print(my_list[2])          # 3
print(my_list[-1])         # 5 (последний элемент)

# Список может содержать разные типы
mixed_list = [1, "text", 3.14, True, None]
print(mixed_list)          # [1, 'text', 3.14, True, None]

Что такое словарь?

Словарь - это неупорядоченная коллекция пар ключ-значение, индексируемая по ключу.

# Создание словаря
my_dict = {"name": "John", "age": 30, "city": "New York"}
print(my_dict)              # {'name': 'John', 'age': 30, 'city': 'New York'}

# Доступ по ключу
print(my_dict["name"])      # John
print(my_dict["age"])       # 30

# Словарь может содержать разные типы значений
my_dict = {"string": "text", "number": 42, "list": [1, 2, 3]}
print(my_dict["list"])      # [1, 2, 3]

Основные различия

ПараметрСписокСловарь
СтруктураУпорядоченная коллекцияПары ключ-значение
ИндексацияПо позиции (0, 1, 2, ...)По ключу
Синтаксис создания[элемент1, элемент2]{ключ1: значение1, ключ2: значение2}
ПорядокПорядок сохраняетсяВ Python 3.7+ порядок сохраняется
Скорость поискаO(n) линейный поискO(1) прямой доступ
Скорость доступаO(1) по индексуO(1) по ключу
КлючиИндексы (числа)Любые хешируемые объекты
Возможность измененияИзменяемыйИзменяемый
ДубликатыМогут бытьКлючи уникальны
Пример[1, 2, 3]{"a": 1, "b": 2}

Практический пример: список

# Список хорош, когда важен порядок
todo_list = ["Купить молоко", "Написать код", "Прочитать книгу"]

# Итерация сохраняет порядок
for i, task in enumerate(todo_list):
    print(f"{i+1}. {task}")
# 1. Купить молоко
# 2. Написать код
# 3. Прочитать книгу

# Добавление в конец
todo_list.append("Погулять")
print(todo_list)  # [..., 'Погулять']

# Вставка в позицию
todo_list.insert(1, "Позвонить другу")
print(todo_list)  # ['Купить молоко', 'Позвонить другу', 'Написать код', ...]

# Удаление
todo_list.remove("Купить молоко")
todo_list.pop(0)  # Удаление по индексу

Практический пример: словарь

# Словарь хорош, когда нужно связать данные
user = {
    "id": 1,
    "name": "John",
    "email": "john@example.com",
    "age": 30
}

# Быстрый доступ по ключу
print(user["email"])        # john@example.com
print(user["name"])         # John

# Проверка наличия ключа
if "age" in user:
    print(f"Возраст: {user['age']}")  # Возраст: 30

# Добавление нового ключа
user["city"] = "New York"
print(user)  # {..., 'city': 'New York'}

# Удаление ключа
del user["age"]
user.pop("city")

# Получение с дефолтным значением
print(user.get("age", 25))  # 25 (если ключа нет)
print(user.get("name", "Unknown"))  # John

Производительность: поиск элемента

import time

# Список: поиск O(n)
my_list = list(range(1_000_000))
start = time.time()
999_999 in my_list  # Ищет с конца
list_time = time.time() - start
print(f"Список: {list_time:.4f} сек")

# Словарь: поиск O(1)
my_dict = {i: i for i in range(1_000_000)}
start = time.time()
999_999 in my_dict  # Прямой доступ
dict_time = time.time() - start
print(f"Словарь: {dict_time:.6f} сек")

# Словарь на 10000x быстрее!
print(f"Словарь быстрее в {list_time / dict_time:.0f}x раз")

Когда использовать список?

Используй список, если:

  • Порядок важен (задачи, события по времени)
  • Нужно итерировать по всем элементам
  • Нужны индексы (получить элемент по позиции)
  • Данные однородны (все одного типа)
  • Нужны операции типа append, insert, pop
# Список оценок студента
grades = [85, 90, 78, 92, 88]
print(f"Первая оценка: {grades[0]}")  # 85
print(f"Последняя оценка: {grades[-1]}")  # 88
print(f"Средняя: {sum(grades) / len(grades)}")  # 86.6

# История платежей (порядок критичен)
payments = [
    {"date": "2024-01-01", "amount": 100},
    {"date": "2024-01-05", "amount": 50},
    {"date": "2024-01-10", "amount": 200},
]

for i, payment in enumerate(payments):
    print(f"Платёж {i+1}: {payment['amount']} от {payment['date']}")

Когда использовать словарь?

Используй словарь, если:

  • Нужен быстрый поиск по ключу
  • Данные неоднородны (разные типы значений)
  • Нужно связать данные (ключ-значение)
  • Ключи имеют смыслическое значение
  • Нужна гибкость структуры
# Профиль пользователя
user_profile = {
    "id": 123,
    "username": "john_doe",
    "email": "john@example.com",
    "is_active": True,
    "followers": 1250,
    "bio": "Python developer"
}

# Быстрый доступ
print(user_profile["email"])  # john@example.com

# Конфигурация приложения
config = {
    "DEBUG": True,
    "DATABASE_URL": "postgresql://...",
    "SECRET_KEY": "...",
    "ALLOWED_HOSTS": ["localhost", "127.0.0.1"],
    "TIMEOUT": 30
}

print(config.get("DEBUG"))  # True

Сложные структуры: смешивание

# Словарь со списками
school = {
    "name": "School #1",
    "students": ["John", "Alice", "Bob"],
    "classes": {
        "math": ["John", "Alice"],
        "english": ["Bob", "Alice"]
    }
}

print(school["students"][0])  # John
print(school["classes"]["math"])  # ['John', 'Alice']

# Список словарей
users = [
    {"id": 1, "name": "John", "age": 30},
    {"id": 2, "name": "Alice", "age": 25},
    {"id": 3, "name": "Bob", "age": 28}
]

print(users[0]["name"])  # John
for user in users:
    print(f"{user['name']}: {user['age']} лет")

Методы: список

my_list = [3, 1, 4, 1, 5]

my_list.append(9)           # Добавить в конец
my_list.insert(0, 2)        # Вставить в позицию
my_list.remove(4)           # Удалить по значению
my_list.pop()               # Удалить последний
my_list.clear()             # Очистить
my_list.copy()              # Копировать
my_list.count(1)            # Считать вхождения
my_list.index(3)            # Индекс элемента
my_list.sort()              # Сортировать
my_list.reverse()           # Развернуть

Методы: словарь

my_dict = {"a": 1, "b": 2, "c": 3}

my_dict["d"] = 4            # Добавить/изменить
my_dict.get("a")            # Получить с default=None
my_dict.get("x", 0)         # Получить с дефолтом
my_dict.pop("b")            # Удалить и вернуть
my_dict.clear()             # Очистить
my_dict.keys()              # Все ключи
my_dict.values()            # Все значения
my_dict.items()             # Пары ключ-значение
my_dict.update({"e": 5})    # Обновить

Сравнение памяти

import sys

# Список
my_list = [1, 2, 3, 4, 5]
print(f"Список: {sys.getsizeof(my_list)} байт")

# Словарь
my_dict = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
print(f"Словарь: {sys.getsizeof(my_dict)} байт")

# Словарь обычно больше, но быстрее

Итоговый вывод

ВыбирайЕсли
СписокПорядок важен, нужна индексация, однородные данные
СловарьНужен быстрый поиск, структурированные данные, ключи имеют смысл

Золотое правило: Используй список для коллекций, словарь для отображений (mapping).