Когда выбирать список / словарь / множество
Когда выбирать список / словарь / множество
Вы знаете три основные коллекции Python: list, dict, set. Каждая создана для своих задач. Правильный выбор структуры данных — один из ключевых навыков программиста. В этом уроке разберём критерии выбора и типичные применения.
Быстрое сравнение
| Критерий | list | dict | set |
|---|---|---|---|
| Порядок | упорядоченный | упорядоченный (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. set, 2. list, 3. dict.
Итог
list— когда важен порядок, нужны дубликаты, доступ по индексу.dict— когда нужно сопоставление ключ → значение, быстрый поиск по имени.set— когда нужны уникальные значения, быстрая проверка вхождения, математические операции над наборами.- Поиск
inдляdictиset— O(1); дляlist— O(n). - Реальные программы часто комбинируют коллекции: список словарей, словарь множеств и т.д.
В следующем уроке изучим dict и set comprehensions — компактный способ создавать словари и множества по формуле.