Словари (Dictionaries) в Python

Словари (Dictionaries) в Python


Словари (Dictionaries) в Python

Определение

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

my_dict = {"name": "Alice", "age": 30, "city": "London"}

Свойства

  1. Уникальность ключей: Каждый ключ может встречаться только один раз.
  2. Изменяемость: Словарь можно изменять (добавлять, удалять элементы).
  3. Динамический размер: Размер меняется по мере добавления/удаления элементов.
  4. Порядок элементов: Начиная с Python 3.7, словари сохраняют порядок добавления элементов.

Основные методы и операции

1. Доступ и изменение элементов

print(my_dict["name"])  # Alice (KeyError, если ключа нет)
print(my_dict.get("name", "Unknown"))  # Alice (без ошибки)
my_dict["age"] = 31     # Обновление
my_dict["country"] = "UK"  # Добавление

2. Методы

  • keys(): Возвращает итерируемый объект с ключами.
  • values(): Возвращает значения.
  • items(): Возвращает пары (ключ, значение).
  • pop(key): Удаляет ключ и возвращает его значение.
  • update(): Обновляет словарь из другого словаря.
  • setdefault(key, default): Возвращает значение ключа или устанавливает default.
for key, value in my_dict.items():
    print(f"{key}: {value}")

3. Удаление

del my_dict["city"]      # Удаление элемента
my_dict.pop("age")       # Удаление с возвратом значения
my_dict.clear()          # Очистка словаря

Итерация и генераторы словарей

Словари можно итерировать по ключам, значениям или парам:

# Итерация по ключам
for key in my_dict:
    print(key)

# Генератор словаря
squares = {x: x**2 for x in range(5)}
even_squares = {k: v for k, v in squares.items() if v % 2 == 0}

OrderedDict

Класс OrderedDict (из модуля collections) сохранял порядок элементов в версиях Python до 3.7. В современных версиях обычные словари также сохраняют порядок, но OrderedDict предлагает дополнительные методы:

  • move_to_end(key): Перемещает ключ в конец.
  • popitem(last=True): Удаляет последний или первый элемент.
from collections import OrderedDict
od = OrderedDict([("a", 1), ("b", 2)])
od.move_to_end("a")

defaultdict

defaultdict (из модуля collections) автоматически создает значения для отсутствующих ключей, используя фабричную функцию.

from collections import defaultdict

# Пример: группировка слов по длине
words = ["apple", "cat", "dog", "banana"]
dd = defaultdict(list)
for word in words:
    dd[len(word)].append(word)

print(dd)  # {5: ['apple'], 3: ['cat', 'dog'], 6: ['banana']}

Hashable в Python

Ключами словаря могут быть только хешируемые объекты:

  • Хешируемые: числа, строки, кортежи (с неизменяемыми элементами).
  • Нехешируемые: списки, словари, множества.

Хешируемость означает, что объект имеет метод __hash__(), который возвращает уникальное целое число, и его значение никогда не меняется.

# Проверка хешируемости
print(hash("Python"))  # Работает
print(hash((1, 2)))    # Работает
# hash([1, 2])         # Ошибка: список нехешируем

Заключение

Словари — один из самых мощных типов данных в Python. Они эффективны для поиска, вставки и удаления элементов. Использование defaultdict и OrderedDict расширяет их функционал, а понимание хешируемости помогает избегать ошибок при работе с ключами.