Когда выбирать список / словарь / множество

Когда выбирать список / словарь / множество

Вы знаете три основные коллекции Python: list, dict, set. Каждая создана для своих задач. Правильный выбор структуры данных — один из ключевых навыков программиста. В этом уроке разберём критерии выбора и типичные применения.

Быстрое сравнение

Критерийlistdictset
Порядокупорядоченныйупорядоченный (3.7+)не гарантирован
Дубликатыдопускаетключи уникальнынет дубликатов
Доступпо индексу [i]по ключу [key]только in
Изменяемостьизменяемыйизменяемыйизменяемый
Поиск (in)O(n) — медленноO(1) — быстроO(1) — быстро
Синтаксис[1, 2, 3]{"k": v}{1, 2, 3}

Когда использовать список (list)

Список подходит, когда:

  • Важен порядок — элементы должны идти в определённой последовательности.
  • Нужны дубликаты — одно значение может встречаться несколько раз.
  • Доступ по позиции — нужно обращаться к n-му элементу.
  • Последовательная обработка — перебор всех элементов по порядку.
# Шаги алгоритма — важен порядок:
steps = ["скачать", "распаковать", "установить", "настроить"]

# Оценки студента — могут повторяться:
grades = [85, 92, 85, 78, 92]

# История команд — порядок важен:
history = ["ls", "cd /home", "pwd", "ls -la"]

Когда использовать словарь (dict)

Словарь подходит, когда:

  • Нужно сопоставление имя → значение (mapping).
  • Быстрый поиск по ключу — не перебирать весь список.
  • Уникальные идентификаторы — каждая запись имеет уникальный ключ.
  • Структурированные данные — объект с набором полей.
# Данные пользователя:
user = {"id": 42, "name": "Алиса", "email": "alice@example.com"}

# Частота слов:
word_count = {"python": 15, "javascript": 8, "sql": 12}

# Кэш результатов — быстрый поиск:
cache = {(10, 5): 15, (3, 7): 10}   # кортеж как ключ

# Конфигурация:
config = {"host": "localhost", "port": 8080, "debug": False}

Когда использовать множество (set)

Множество подходит, когда:

  • Нужна уникальность — каждое значение только один раз.
  • Математические операции — пересечение, объединение, разность.
  • Быстрая проверка вхождения — частые in-проверки.
  • Порядок не важен.
# Уникальные IP-адреса посетителей:
visitors = {"192.168.1.1", "10.0.0.5", "192.168.1.1"}   # дубликат удалён

# Доступные разрешения:
permissions = {"read", "write", "execute"}
if "write" in permissions:
    print("Разрешена запись")

# Общие теги двух постов:
tags1 = {"python", "programming", "tutorial"}
tags2 = {"python", "web", "django"}
common = tags1 & tags2   # {'python'}

Типичные паттерны выбора

Паттерн 1: данные с порядком → список

# Очередь задач (порядок выполнения важен):
tasks = ["задача_1", "задача_2", "задача_3"]
current = tasks.pop(0)   # взять первую

Паттерн 2: поиск по имени → словарь

# Таблица телефонов — часто ищем по имени:
phone_book = {"Алиса": "+7 900 123-45-67", "Борис": "+7 900 765-43-21"}
print(phone_book.get("Алиса"))   # O(1)

Паттерн 3: уникальность и быстрый поиск → множество

# Проверенные URL — не проверять дважды:
visited = set()
urls = ["http://a.com", "http://b.com", "http://a.com"]
for url in urls:
    if url not in visited:
        visited.add(url)
        # обработать url

Составные структуры

Реальные программы часто комбинируют коллекции:

# Список словарей — таблица пользователей:
users = [
    {"id": 1, "name": "Алиса", "score": 92},
    {"id": 2, "name": "Борис", "score": 85},
]

for user in users:
    print(f"{user['name']}: {user['score']}")

# Словарь списков — группировка:
by_grade = {"A": [], "B": [], "C": []}
for user in users:
    grade = "A" if user["score"] >= 90 else "B" if user["score"] >= 80 else "C"
    by_grade[grade].append(user["name"])

print(by_grade)   # {'A': ['Алиса'], 'B': ['Борис'], 'C': []}

Производительность: почему dict и set быстрее

Словари и множества используют хэш-таблицы. Поиск элемента работает за O(1) в среднем, независимо от размера коллекции. Список ищет за O(n) — просматривает каждый элемент по очереди.

import time

big_list = list(range(1_000_000))
big_set = set(range(1_000_000))

target = 999_999

# Поиск в списке:
start = time.time()
result = target in big_list
print(f"list: {time.time() - start:.4f}с")   # ~0.015с

# Поиск в множестве:
start = time.time()
result = target in big_set
print(f"set: {time.time() - start:.6f}с")    # ~0.0001с

Проверь себя

Какую коллекцию выбрать для каждой задачи?

  1. Хранить названия всех стран мира, быстро проверять «входит ли страна».
  2. Хранить список покупок в порядке добавления.
  3. Хранить пары «слово» → «перевод» для словаря.

Ответы: 1. set, 2. list, 3. dict.

Итог

  • list — когда важен порядок, нужны дубликаты, доступ по индексу.
  • dict — когда нужно сопоставление ключ → значение, быстрый поиск по имени.
  • set — когда нужны уникальные значения, быстрая проверка вхождения, математические операции над наборами.
  • Поиск in для dict и set — O(1); для list — O(n).
  • Реальные программы часто комбинируют коллекции: список словарей, словарь множеств и т.д.

В следующем уроке изучим dict и set comprehensions — компактный способ создавать словари и множества по формуле.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике