Фильтрация ключей словаря и объединение значений по ключам в словаре python
Предоставлю пример исходных данных на python:
dict1 = {'apple': {'red': True}, 'apple-2': {'yellow': True}, 'apple-3': {'green': False}, 'melon': {'yellow': True}, 'orange': {'red': True}, 'orange-2': {'orange': False}}
Таким образом, в словаре ключи - названия фруктов, а в значениях этих ключей - словарь с цветом фрукта и его наличии на складе (True/False)
Задача: Преобразовать словарь так, чтобы он выглядел следующим образом:
dict1 = {'apple': {'red': True, 'yellow': True, 'green': False}, 'melon': {'yellow': True}, 'orange': {'red': True, 'orange': False}}
То есть нужно объединить значения в единый словарь по тем ключам, которые начинаются одинаково вплоть до '-'. В результате ключи 'apple', 'apple-1' и 'apple-2' объединяются в один 'apple', и значения этих ключей засовываются в один словарь {'red': True, 'yellow': True, 'green': False}. То же самое и с остальными фруктами.
Буду очень благодарен помощи в решении этой задачки, сам ломал голову несколько часов.
Ответы (2 шт):
Вы можете использовать следующий код:
dict1 = {'apple': {'red': True}, 'apple-2': {'yellow': True}, 'apple-3': {'green': False}, 'melon': {'yellow': True}, 'orange': {'red': True}, 'orange-2': {'orange': False}}
new_dict = {}
for key in dict1.keys():
# Получаем часть ключа до знака "-"
fruit_name = key.split("-")[0]
if fruit_name not in new_dict:
new_dict[fruit_name] = {}
# Объединяем значения в один словарь
new_dict[fruit_name].update(dict1[key])
print(new_dict)
Этот код выведет:
{'apple': {'red': True, 'yellow': True, 'green': False}, 'melon': {'yellow': True}, 'orange': {'red': True, 'orange': False}}
Мы создали новый словарь new_dict и прошлись по всем ключам в исходном словаре dict1. Для каждого ключа мы получили название фрукта, отсекая часть ключа после знака "-". Затем мы проверили, существует ли уже этот фрукт в new_dict, и если нет, то добавили его с пустым словарем в качестве значения. Затем мы объединили словарь со значениями из ключа в new_dict для соответствующего названия фрукта.
dict.items() проходит по словарю возвращая пары ключ/значение.
dict.setdefault(key[, default]). Если ключ key в словаре, возвращает его значение, иначе создаёт ключ со значением default.
dict.update([other]) - обновляет словарь парами ключ/значение из словаря other.
dict1 = {
'apple': {'red': True},
'apple-2': {'yellow': True},
'apple-3': {'green': False},
'melon': {'yellow': True},
'orange': {'red': True},
'orange-2': {'orange': False}
}
dict2 = {}
for k, v in dict1.items():
dict2.setdefault(k.split('-')[0], {}).update(v)
print(dict2)