Словарь и set в Python: ключевые различия и сценарии использования

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

Словарь и множество: основы работы

Основные операции с dict и set

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

d = {'apple': 5, 'banana': 3}
s = {1, 2, 3, 2}

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

Доступ к элементу словаря: d['apple'] - возвращает 5. Если ключа нет, возникает KeyError. Безопаснее использовать d.get('orange', 0).

Добавление элемента в set: s.add(4). Проверка вхождения: 3 in s.

Важно: ключи dict и элементы set должны быть хешируемыми (числа, строки, кортежи, frozenset). Изменяемые типы (list, dict) недопустимы.

Как проверить, есть ли ключ в словаре?

if 'apple' in d:
    print(d['apple'])

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

Оператор in выполняет проверку за O(1). В старых версиях Python использовался метод has_key(), который считается устаревшим.

Ошибка: использование d.has_key('apple') в Python 3 вызовет AttributeError.

Как объединить два словаря?

d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
# Способ 1: update()
d1.update(d2)  # d1 изменяется, {'a':1, 'b':3, 'c':4}
# Способ 2: оператор | (Python 3.9+)
merged = d1 | d2
# Способ 3: распаковка
merged = {**d1, **d2}

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

При совпадении ключей значение берется из второго словаря. Порядок сохраняется (начиная с Python 3.7).

Проблема: метод update() изменяет исходный словарь, что может быть неожиданно. Оператор | создает новый.

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

keys = ['a', 'b', 'c']
d = dict.fromkeys(keys, 0)
# {'a':0, 'b':0, 'c':0}

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

fromkeys - классовый метод, принимает итерируемый объект с ключами и значение по умолчанию. Если значением является изменяемый объект, все ключи будут ссылаться на один и тот же экземпляр, что может привести к побочным эффектам.

Ошибка: d = {k: [] for k in keys} - корректно, а dict.fromkeys(keys, []) - все ключи указывают на один список.

Как удалить дубликаты из списка, сохранив порядок?

lst = [3, 1, 2, 3, 2, 4]
unique = list(dict.fromkeys(lst))  # или OrderedDict.fromkeys в старых версиях
# [3, 1, 2, 4]

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

Использование set(lst) не гарантирует порядок. dict.fromkeys использует словарь для дедупликации (ключи уникальны) и сохраняет порядок вставки (Python 3.7+).

В Python 3.6 и ниже порядок не гарантирован, тогда следует использовать OrderedDict.

Как найти элементы, присутствующие в обоих множествах?

a = {1, 2, 3}
b = {2, 3, 4}
intersection = a & b  # {2, 3}

кортеж чисел python (кортеж чисел в python)

Оператор & и метод intersection() возвращают новое множество. Также есть union (|), difference (-), symmetric_difference (^).

Как получить уникальные значения из словаря?

d = {'x': 1, 'y': 2, 'z': 1}
unique_vals = set(d.values())  # {1, 2}

язык программирования python массивы (массивы (списки) в python)

Преобразуем итератор значений в множество. Проблема, если значения нехешируемые - будет TypeError.

Как отсортировать словарь по ключам?

d = {'banana': 3, 'apple': 5, 'cherry': 2}
sorted_items = sorted(d.items())  # [('apple',5), ('banana',3), ('cherry',2)]
new_dict = dict(sorted_items)     # {'apple':5, 'banana':3, 'cherry':2}

массивы данных python 3 (массивы данных в python)

Сортировка возвращает список кортежей, затем можно создать новый словарь (порядок сохранится). Похожим образом сортируют по значениям, используя key=lambda x: x[1].

Как проверить, что одно множество является подмножеством другого?

a = {1, 2}
b = {1, 2, 3}
print(a <= b)  # True
print(a.issubset(b))

Также есть >= для надмножества.

Типичные ошибки при работе с dict и set

  • Использование списка как ключа: d[[1,2]] = 3 вызывает TypeError: unhashable type: 'list'. Решение - преобразовать в кортеж или frozenset.
  • Попытка добавить изменяемый объект в set: s.add([1,2]) также вызывает TypeError.
  • Предположение, что set сохраняет порядок: множество неупорядочено, хотя в современных версиях порядок может случайно сохраняться для маленьких чисел, полагаться нельзя.
  • Изменение словаря во время итерации: for k in d: del d[k] вызывает RuntimeError. Решение - итерировать по копии ключей: for k in list(d):
- программы с массивами на python (программы с массивами на python)
- Python пар (пары (ключ-значение) в python)
- Python разница списков (разница между списками и кортежами в python)

Пример 1: подсчет частоты элементов с Counter

Пример
from collections import Counter
lst = ['a', 'b', 'a', 'c', 'b', 'a', 'a']
cnt = Counter(lst)
print(cnt)
print(cnt.most_common(2))
Counter({'a': 4, 'b': 2, 'c': 1})
[('a', 4), ('b', 2)]

Counter - это подкласс dict, автоматически подсчитывает количество вхождений. Метод most_common возвращает список кортежей с частотами.

Пример 2: инвертирование словаря (значения -> список ключей)

Пример
original = {'apple': 'fruit', 'carrot': 'vegetable', 'banana': 'fruit'}
inverted = {}
for k, v in original.items():
    inverted.setdefault(v, []).append(k)
print(inverted)
{'fruit': ['apple', 'banana'], 'vegetable': ['carrot']}

Метод setdefault создает пустой список, если ключа нет, и присоединяет к нему текущий ключ. Такой подход позволяет группировать значения.

Пример 3: использование frozenset в качестве ключа словаря

Пример
fs1 = frozenset([1,2])
fs2 = frozenset([2,3])
d = {fs1: 'A', fs2: 'B'}
print(d[frozenset([3,2])])  # 'B' (так как frozenset нечувствителен к порядку)
B

frozenset - неизменяемая версия set, поэтому может быть ключом dict или элементом другого set. Полезно для хранения неупорядоченных наборов данных.

Пример 4: слияние словарей с помощью оператора | (Python 3.9+)

Пример
d1 = {'x': 1, 'y': 2}
d2 = {'y': 3, 'z': 4}
merged = d1 | d2
merged |= {'w': 5}  # оператор |= изменяет merged на месте
print(merged)
{'x': 1, 'y': 3, 'z': 4, 'w': 5}

Операторы | и |= появились в Python 3.9. Они создают новый словарь (или обновляют) с объединенными ключами. Значения из правого операнда перезаписывают левый.

Пример 5: поиск общих друзей с использованием set

Пример
user1_friends = {'Alice', 'Bob', 'Charlie'}
user2_friends = {'Bob', 'David', 'Eve'}
common = user1_friends & user2_friends
all_friends = user1_friends | user2_friends
unique_to_user1 = user1_friends - user2_friends
print(f'Общие: {common}')
print(f'Все уникальные: {all_friends}')
print(f'Только у первого: {unique_to_user1}')
Общие: {'Bob'}
Все уникальные: {'Alice', 'Bob', 'Charlie', 'David', 'Eve'}
Только у первого: {'Alice', 'Charlie'}

Множества удобны для операций над множествами без циклов.

Пример 6: сравнение производительности поиска в list и set

Пример
import timeit
lst = list(range(100000))
st = set(lst)
print(timeit.timeit('99999 in lst', globals=globals(), number=1000))
print(timeit.timeit('99999 in st',  globals=globals(), number=1000))
0.0745 (время в секундах для list)
0.0003 (время в seconds для set)

Поиск в set происходит значительно быстрее за счет хеш-таблицы. Это особенно заметно на больших данных.

Пример 7: работа с defaultdict для автозаполнения

Пример
from collections import defaultdict
dd = defaultdict(list)
dd['group'].append('item1')
dd['group'].append('item2')
print(dd)
defaultdict(<class 'list'>, {'group': ['item1', 'item2']})

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

Словарь и set в Python - comments

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