Словари и множества Python: основные возможности

Раздел: Python -> Структуры данных

Основные понятия и эффективное использование

Словарь (dict) и множество (set) в Python реализованы на основе хэш-таблиц, что обеспечивает среднее время доступа O(1). Словарь хранит пары ключ-значение, где ключи должны быть хэшируемыми (строки, числа, кортежи неизменяемых элементов). Множество представляет собой неупорядоченную коллекцию уникальных элементов, также хэшируемых.

d = {"apple": 1, "banana": 2}
s = {1, 2, 3, 2}  # {1, 2, 3}

значения списка числа python (итерация по значениям списка чисел в python)

Основные проблемы и их решения:

Использование в качестве ключа изменяемых объектов (списки, множества) вызывает TypeError. Решение: применять только хэшируемые типы или преобразовывать их в кортежи.
Множество не поддерживает индексацию и срезы. Для доступа по индексу требуется преобразование в список: list(s)[0].

Как создать словарь с автоматическим значением по умолчанию?

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

from collections import defaultdict
words = ['apple', 'banana', 'apple']
counts = defaultdict(int)
for w in words:
    counts[w] += 1
# counts: {'apple':2, 'banana':1}

словарь set python (словарь и set в python)

Типичная ошибка: забыть импортировать defaultdict. Также фабрика должна вызываться без аргументов (int, list, lambda: []).

Как подсчитать частоту элементов в последовательности?

Класс Counter из модуля collections является специализированным словарем для подсчета:

from collections import Counter
cnt = Counter('abracadabra')
# Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})

Python dict set (словарь и множество в python)

Counter не является обычным dict, при получении отсутствующего ключа возвращает 0, но при итерации могут быть неожиданности.

Как сохранить порядок вставки ключей в словаре?

Начиная с Python 3.7, обычный dict гарантирует порядок вставки. Для версий 3.6 и ниже или для дополнительных методов (перемещение в конец) используется OrderedDict.

from collections import OrderedDict
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od.move_to_end('a')  # перемещает 'a' в конец

типы структур python (типы структур данных в python)

В современных версиях обычный dict уже упорядочен, но OrderedDict может быть полезен для явного указания намерения.

Как использовать множество в качестве ключа словаря?

Обычное множество (set) изменяемо, поэтому не может быть ключом. Используется frozenset - неизменяемый аналог.

fs = frozenset([1,2,3])
d = {fs: "value"}
print(d[fs])  # "value"

вложенные структуры данных в python (вложенные структуры данных в python)

Изменение frozenset невозможно; при попытке изменить исходное множество ключ словаря останется прежним.

Как эффективно создать словарь или множество на основе последовательности?

Генераторы словарей (dict comprehension) и множеств (set comprehension) позволяют компактно создавать коллекции.

squares_dict = {x: x**2 for x in range(5)}   # {0:0,1:1,2:4,3:9,4:16}
evens_set = {x for x in range(10) if x % 2 == 0}  # {0,2,4,6,8}
При создании dict comprehension с дублирующимися ключами последний победит; для set дубликаты автоматически удаляются.
- массивы данных python 3 (массивы данных в python)
- одномерные массивы на языке программирования python (одномерные массивы в python)
- последовательности в python и способы их реализации (последовательности в python и способы их реализации)

Расширенные примеры работы со словарями и множествами

Рассмотрим нестандартные и продвинутые случаи использования.

Пример
# Пример 1: Объединение словарей оператором | (Python 3.9+)
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
merged = d1 | d2
print(merged)
{'a': 1, 'b': 3, 'c': 4}
Пример
# Пример 2: Разность множеств для поиска уникальных элементов
a = [1,2,3,4,5]
b = [4,5,6,7]
unique_a = set(a) - set(b)
print(unique_a)
{1, 2, 3}
Пример
# Пример 3: Безопасное обновление вложенного словаря с setdefault
def deep_update(d, keys, value):
    for key in keys[:-1]:
        d = d.setdefault(key, {})
    d[keys[-1]] = value
nested = {'user': {'name': 'Alice', 'age': 30}}
deep_update(nested, ['user', 'email'], 'alice@example.com')
print(nested)
{'user': {'name': 'Alice', 'age': 30, 'email': 'alice@example.com'}}
Пример
# Пример 4: Группировка объектов с defaultdict(list)
class Person:
    def __init__(self, name, city):
        self.name = name
        self.city = city
people = [Person('Alice','NY'), Person('Bob','LA'), Person('Charlie','NY')]
from collections import defaultdict
grouped = defaultdict(list)
for p in people:
    grouped[p.city].append(p.name)
print(dict(grouped))
{'NY': ['Alice', 'Charlie'], 'LA': ['Bob']}
Пример
# Пример 5: frozenset как ключ для неориентированных графов
edges = {(frozenset(['A','B'])): 5, (frozenset(['A','C'])): 3}
print(edges[frozenset(['B','A'])])  # 5, так как frozenset неупорядочен
5
Пример
# Пример 6: Генератор множества с условием (составные числа)
composite = {x for x in range(2,20) if any(x % y == 0 for y in range(2,x))}
print(sorted(composite))
[4, 6, 8, 9, 10, 12, 14, 15, 16, 18]
Пример
# Пример 7: Мемоизация с помощью словаря
def fib(n):
    cache = {}
    def helper(n):
        if n in cache:
            return cache[n]
        if n < 2:
            result = n
        else:
            result = helper(n-1) + helper(n-2)
        cache[n] = result
        return result
    return [helper(i) for i in range(n)]
print(fib(10))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Пример
# Пример 8: Операции над множествами: объединение, пересечение, разность, симметричная разность
set1 = {1,2,3,4}
set2 = {3,4,5,6}
print('Union:', set1 | set2)
print('Intersection:', set1 & set2)
print('Difference:', set1 - set2)
print('Symmetric difference:', set1 ^ set2)
Union: {1, 2, 3, 4, 5, 6}
Intersection: {3, 4}
Difference: {1, 2}
Symmetric difference: {1, 2, 5, 6}
Пример
# Пример 9: OrderedDict и перемещение ключа
from collections import OrderedDict
od = OrderedDict()
od['x'] = 10
od['y'] = 20
od['z'] = 30
od.move_to_end('x')
print(od)
OrderedDict([('y', 20), ('z', 30), ('x', 10)])
Пример
# Пример 10: Мультисловарь с setdefault
d = {}
d.setdefault('key', []).append(1)
d.setdefault('key', []).append(2)
print(d)
{'key': [1, 2]}

Словарь и множество в Python - comments

En
Python dict set (python)