Добавить в корзинуПозвонить
Найти в Дзене

Словари против списков в Python: рассадник багов или тачка для тачек? Выбираем правильно

Ты уже знаешь и списки ([]), и словари ({}). Оба — тачки для данных. Но новичок постоянно тупит: что взять, когда?
Сейчас разложу по полочкам так, что запомнишь навсегда. Поехали.
1. Список — это советская очередь
Представь очередь в поликлинике. У каждого талончик с номером: 0, 1, 2, 3...

Ты уже знаешь и списки ([]), и словари ({}). Оба — тачки для данных. Но новичок постоянно тупит: что взять, когда?

Сейчас разложу по полочкам так, что запомнишь навсегда. Поехали.

1. Список — это советская очередь

Представь очередь в поликлинике. У каждого талончик с номером: 0, 1, 2, 3...

```python

queue = ["Анна", "Олег", "Марина", "Саша"]

# queue[0] -> "Анна"

# queue[2] -> "Марина"

```

Плюсы списка:

· бешенная скорость обхода подряд (for item in list)

· порядок сохраняется всегда

· можно вставлять/удалять с концов за O(1)

Минусы:

· чтобы найти "Марина", нужно перебрать всех (медленно при 100500 элементах)

· если вставишь в середину — всё переиндексируется (тормоза)

2. Словарь — это шкаф с наклейками

Никаких номеров. Ты сам лепишь на каждую ячейку понятную бирку: "имя", "возраст", "телефон".

```python

catalog = {

  "iPhone": 100000,

  "Samsung": 80000,

  "Xiaomi": 40000

}

# catalog["iPhone"] -> 100000 мгновенно

```

Плюсы словаря:

· доступ по ключу за O(1) — МГНОВЕННО, даже если миллиард элементов

· ключи осмысленные: не помнить index=5, а писать user["phone"]

· гибкая структура: значениями могут быть что угодно

Минусы:

· занимает больше памяти (хранит хэши ключей)

· нет порядка (условно, хотя с Python 3.7 он сохраняется, но на это не рассчитывают)

· чуть медленнее на маленьких объёмах

3. А теперь главное: КОГДА что ЮЗАТЬ?

Бери СПИСОК, если:

✅ Тебе важен порядок элементов

✅ Ты будешь перебирать всё подряд (for item in items)

✅ Нужно хранить однотипные штуки (только имена, только числа)

✅ Доступ по номеру — это логично (топ-10 фильмов, очередь задач)

```python

# Хороший список

top_movies = ["Побег из Шоушенка", "Крёстный отец", "Тёмный рыцарь"]

daily_temperatures = [23.5, 24.1, 22.8, 23.0]

```

Бери СЛОВАРЬ, если:

✅ Нужен быстрый поиск по уникальному ключу

✅ У данных есть явные имена (id, логин, артикул)

✅ Структура сложная: у одного объекта много полей

✅ Ты работаешь с JSON/API — там почти всегда словари

```python

# Хороший словарь

user_profile = {

  "id": 777,

  "name": "Антон",

  "is_admin": True,

  "orders": [101, 102, 103]

}

# Поиск цены товара по артикулу

prices = {"A001": 500, "B002": 1200, "C003": 340}

```

4. Живой пример — где новички ломают зубы

Задача: у тебя список имён и список зарплат. Нужно найти зарплату Олега.

❌ ПЛОХОЕ решение (список для поиска):

```python

names = ["Анна", "Олег", "Марина"]

salaries = [50000, 70000, 60000]

# Найти индекс Олега

index = names.index("Олег") # O(n) — полный перебор

print(salaries[index])

```

✅ ХОРОШЕЕ решение (словарь):

```python

data = {"Анна": 50000, "Олег": 70000, "Марина": 60000}

print(data["Олег"]) # O(1) — моментально

```

Разница при 10000 элементов: словарь отработает за 0.0001 секунды, список — за 0.5 секунды. Чувствуешь?

5. Когда можно и то, и то (но лучше комбо)

Иногда умные ребята делают список словарей — это база данных в миниатюре.

```python

users = [

  {"id": 1, "name": "Анна", "age": 25},

  {"id": 2, "name": "Олег", "age": 30},

  {"id": 3, "name": "Марина", "age": 28}

]

# Найти Анну

for user in users:

  if user["name"] == "Анна":

    print(user["age"])

```

Или словарь списков — удобно для группировки:

```python

grades = {

  "Математика": [5, 4, 5, 5],

  "Физика": [4, 4, 3, 5],

  "Информатика": [5, 5, 5, 4]

}

```

6. Чек-лист перед выбором (повесь на стену)

Задай себе 3 вопроса:

1. Мне нужен порядок? Да → список. Нет → словарь.

2. Я буду часто искать по значению? Да → словарь. Нет → список.

3. Данные — это просто список однотипных вещей? Да → список. Нет (разные поля) → словарь.

7. Жестокая правда

· Использовать список для поиска по имени — признак дилетанта.

· Использовать словарь с ключами "0","1","2"... — извращение (бери список).

· Засовывать 10 полей в список и помнить, что data[3] — это возраст, а data[4] — город — путь в ад. Только словарь.

Финальный удар

Вот тебе код для закрепления. Угадай, что быстрее найдёт "Python" в 100000 элементов?

```python

# Словарь

tech_dict = {f"lang_{i}": f"value_{i}" for i in range(100000)}

tech_dict["python"] = "Python"

# Список

tech_list = [f"value_{i}" for i in range(100000)] + ["Python"]

# Поиск в словаре (моментально)

if "python" in tech_dict:

  print("Нашёл за 0.0001 сек")

# Поиск в списке (медленно)

if "Python" in tech_list:

  print("Нашёл за 0.05 сек")

```

Правильный выбор структуры данных — это 50% успеха в Python. Остальное — практика.

---

Подписывайся, если хочешь следующую битву:

→ Кортежи против списков

→ Множества против словарей

→ Когда использовать array из модуля array

Не будь нубом — выбирай правильные структуры. ✊