Фильтрация ключей словаря и объединение значений по ключам в словаре python

Рейтинг: -1Ответов: 2Опубликовано: 05.04.2023

Предоставлю пример исходных данных на 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 для соответствующего названия фрукта.

▲ 0

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)