Бывают задачи когда из большого массива объектов требуется отфильтровать эти объекты по категориям.
В результате получаем словарь примерно такого вида:
data = {
"category1": [item1, item2, ...],
"category2": [item1, item2, ...],
...
}
При этом заранее мы не знаем список категорий и их необходимо добавлять в процессе итерации. Как такой код будет выглядеть:
items = [...]
sorted_items = {}
for item in items:
cat = get_category(item)
if cat not in sorted_items:
sorted_items[cat] = []
sorted_items[cat].append(item)
Значением ключа является не сам элемент а промежуточный объект это список. Потому нам следует сначала убедиться, что он есть, а если нету то создать.
Альтернативный код делающий тоже самое:
for item in items:
cat = get_category(item)
if cat not in sorted_items:
sorted_items[cat] = [item]
else:
sorted_items[cat].append(item)
Чтобы избежать этой проверки можно использовать тип defaultdict, это очень простой класс который сам за вас сделает проверку и добавит нужный тип если его нет. Просто укажите нужный тип в конструкторе.
from collections import defauldict
items = [...]
sorted_items = defaultdict(list)
for item in items:
sorted_items[get_category(item)].append(item)
Если указанного ключа нет в словаре, то он создаётся сразу со списком в значении и возвращается как будто он там и был.
#tricks#libs