В чем разница между списком (list) и словарем (dict) в Python?

Ответ

Список (list) — это изменяемая, упорядоченная последовательность элементов. Доступ к элементам осуществляется по целочисленному индексу (начиная с 0). Элементы могут повторяться.

Словарь (dict) — это изменяемое, неупорядоченное (до Python 3.7 порядок вставки не гарантировался, с 3.7+ — сохраняется) отображение уникальных ключей на значения. Доступ к данным осуществляется по ключу, который должен быть хешируемым объектом (например, строка, число, кортеж).

Основные различия: Критерий Список (list) Словарь (dict)
Структура Упорядоченная последовательность Коллекция пар ключ: значение
Индексация По целочисленному индексу (my_list[0]) По ключу (my_dict['key'])
Уникальность Элементы могут дублироваться Ключи уникальны, значения могут повторяться
Производительность Быстрый доступ по индексу, поиск элемента — O(n) Быстрый доступ, вставка и удаление по ключу — ~O(1)
Использование Для хранения однотипных данных, где важен порядок Для хранения данных с уникальными идентификаторами (как ассоциативный массив)

Примеры:

# Список: порядок и индексы имеют значение
users_list = ['Алиса', 'Боб', 'Алиса']
print(users_list[1])  # Боб

# Словарь: доступ по уникальному ключу
user_dict = {
    'id_101': {'name': 'Алиса', 'role': 'admin'},
    'id_102': {'name': 'Боб', 'role': 'user'}
}
print(user_dict['id_102']['name'])  # Боб

# Проверка наличия элемента
if 'Боб' in users_list:  # Линейный поиск O(n)
    print('Найден в списке')

if 'id_102' in user_dict:  # Поиск по хешу ~O(1)
    print('Ключ найден в словаре')

Ответ 18+ 🔞

А, ну ты глянь, какие у нас тут коллекции в Питоне развелись, прям как на базаре — одни в ряд стоят, другие по карманам разложились. Сейчас разберём эту пиздопроебибну.

Вот представь, у тебя есть список (list). Это как очередь в поликлинике, сука. Все стоят по порядку, у каждого номерок есть — 0, 1, 2... Подходи, называй цифру — получай человека. Очередь может двигаться, кто-то новый пришёл — встал в конец, кого-то выгнали — все сдвинулись. И самое главное — один и тот же мудак может записаться дважды, система-то не палит.

А теперь словарь (dict) — это уже не очередь, а, блядь, гардероб с номерками. У каждой куртки (значения) есть свой уникальный номерок (ключ). Тебе не нужно помнить, что чёрная пуховик висит пятым по счёту — ты просто ищешь номерок "57" и хуяк, вот он. Искать по номерку — мгновенно. А вот искать какую-то конкретную розовую дублёнку, не зная номерка — это пиздец, придётся все вещи перебрать.

Короче, различия как между табуреткой и комодом:

Критерий Список (табуретка) Словарь (комод с ящиками)
Структура Все сидят на одной доске, по порядку. У каждой носка свой ящик с биркой.
Как найти "Эй, ты, третий с края, вставай!" "Где носки с биркой 'любимые'?"
Повторения Можешь посадить пять одинаковых дядь Вась. Два ящика с биркой 'любимые' быть не может, ёпта.
Скорость поиска "Где тут дядя Вася?" — надо всех пересмотреть, O(n). "Где ящик 'любимые'?" — открыл сразу, ~O(1).
Зачем нужно Когда важен порядок: очередь, история, просто набор. Когда есть уникальный ID: пользователи, настройки, данные.

Ну и примеры, чтобы совсем охуенно стало:

# Список — очередь за айфонами. Один чел может прийти дважды.
queue = ['Васян', 'Петрович', 'Васян']
print(queue[1])  # Смотрим, кто второй в очереди. Петрович, блядь.

# Словарь — база клиентов. У каждого уникальный пропуск.
clients = {
    'vip_001': {'name': 'Васян', 'debt': 100500},
    'debtor_404': {'name': 'Петрович', 'debt': 0}
}
print(clients['debtor_404']['name'])  # Смотрим клиента по номеру пропуска. Петрович.

# Поиск в списке — линейный, можно и так, но если очередь длинная — заебёшься.
if 'Петрович' in queue:
    print('Нашёлся в очереди, ждёт.')

# Поиск в словаре — по ключу, моментально.
if 'debtor_404' in clients:
    print('Ключ найден, можно данные выцыганить.')

Вот и вся философия. Хочешь хранить что-то просто подряд — бери список. Нужно быстро находить по уникальному имени — словарь тебе в помощь. Главное — не перепутай, а то вместо носков из комода начнёшь табуретку по номерку искать, получишь KeyError и пиздец.