Словари и множества Python: основные возможности
Основные понятия и эффективное использование
Словарь (dict) и множество (set) в Python реализованы на основе хэш-таблиц, что обеспечивает среднее время доступа O(1). Словарь хранит пары ключ-значение, где ключи должны быть хэшируемыми (строки, числа, кортежи неизменяемых элементов). Множество представляет собой неупорядоченную коллекцию уникальных элементов, также хэшируемых.
d = {"apple": 1, "banana": 2}
s = {1, 2, 3, 2} # {1, 2, 3}значения списка числа python (итерация по значениям списка чисел в python)
Основные проблемы и их решения:
Как создать словарь с автоматическим значением по умолчанию?
Модуль 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)
Как подсчитать частоту элементов в последовательности?
Класс Counter из модуля collections является специализированным словарем для подсчета:
from collections import Counter
cnt = Counter('abracadabra')
# Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
Python dict set (словарь и множество в python)
Как сохранить порядок вставки ключей в словаре?
Начиная с 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)
Как использовать множество в качестве ключа словаря?
Обычное множество (set) изменяемо, поэтому не может быть ключом. Используется frozenset - неизменяемый аналог.
fs = frozenset([1,2,3])
d = {fs: "value"}
print(d[fs]) # "value"вложенные структуры данных в python (вложенные структуры данных в python)
Как эффективно создать словарь или множество на основе последовательности?
Генераторы словарей (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}
Расширенные примеры работы со словарями и множествами
Рассмотрим нестандартные и продвинутые случаи использования.
# Пример 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]}