добавьте значение вложенного словаря, если ключ существует

#python

Вопрос:

У меня есть код. Я взял его только из переполнения стека

ниже приведен код

 def does_nested_key_exists(dictionary, nested_key, keys=None):
    if keys is None:
        keys = []

    for key, value in dictionary.items():
        if key == nested_key:
            return True, '.'.join(keys)
        if isinstance(value, dict):
            keys.append(key)
            return does_nested_key_exists(value, nested_key, keys)
    return False, ""

menu = {'dinner':
            {'chicken':'good',
             'beef':'average',
             'vegetarian':{
                   'tofu':'good',
                   'salad':{
                            'caeser':'bad',
                            'italian':'average'}
                   },
             'pork':'bad'}
        }
 

Что мне нужно, так это если предположить, что новый ключ предполагает green_veg наличие родителя vegetarian (как есть), мне нужно добавить green_veg ключ под тем же родительским ключом vegetarian . Предположим, что если родительский ключ не существует, я хочу добавить в основной дикт, например, прямой ключ для меню дикт

Как я могу этого достичь

Комментарии:

1. Какова глубина наличия словаря в качестве значения?

2. не уверен в глубине. Он может опуститься на любой уровень ниже.

3. если глубина неясна, куда вы должны добавить новый элемент, если родителя нигде нет.

4. на основном уровне

Ответ №1:

Посмотрите на два примера:

  1. {"green_veg": "bad"} с родителем vegetarian , где родитель присутствует в названном словаре menu .
  2. {"green_veg": "bad"} с родителем greens , если родитель отсутствует в названном словаре menu .
  3. Также приведены примеры процессов.

Вот код:

 class Solution:
    def __init__(self) -> None:
        self.parents = []

    def fun(self, dikt: dict, find_key, new_key):
        if find_key in dikt:
            dikt[find_key][new_key] = {}
            return True
        f = False
        for key, value in dikt.items():
            if isinstance(value, dict):
                f = f or self.fun(value, find_key, new_key)
        return f

    def call(self, dikt: dict, find_key, new_key):
        p = self.fun(dikt, find_key, new_key)
        if not p:
            dikt[new_key] = {}
 

Пример 1 (из вопроса)

 menu = {
    "dinner": {
        "chicken": "good",
        "beef": "average",
        "vegetarian": {
            "tofu": "good",
            "salad": {"caeser": "bad", "italian": "average"},
        },
        "pork": "bad",
    }
}
print(menu)
Solution().call(menu, "vegetarian", "green_veg")
print(menu)
Solution().call(menu, "greens", "green_veg")
print(menu)
 

Вот результат:

 {'dinner': {'chicken': 'good', 'beef': 'average', 'vegetarian': {'tofu': 'good', 'salad': {'caeser': 'bad', 'italian': 'average'}}, 'pork': 'bad'}}
{'dinner': {'chicken': 'good', 'beef': 'average', 'vegetarian': {'tofu': 'good', 'salad': {'caeser': 'bad', 'italian': 'average'}, 'green_veg': {}}, 'pork': 'bad'}}
{'dinner': {'chicken': 'good', 'beef': 'average', 'vegetarian': {'tofu': 'good', 'salad': {'caeser': 'bad', 'italian': 'average'}, 'green_veg': {}}, 'pork': 'bad'}, 'green_veg': {}}
 

Пример 2 (из комментариев)

 menu = {}
print(menu)
Solution().call(menu, "None", "p1")
Solution().call(menu, "p1", "p2")
Solution().call(menu, "p2", "p3")
print(menu)
 

Вот результат:

 {}
{'p1': {'p2': {'p3': {}}}}
 

Комментарии:

1. Спасибо, но я ищу кое-что другое

2. не могли бы вы поподробнее рассказать об этом?

3. да, я печатаю

4. Мне нужно что-то вроде этого: Решение().вызов(меню, «родитель», «новый ключ»). Если родитель существует, добавьте его к родителю, а если нет, добавьте в меню клавишу, а не клавишу «Ужин». и ценность также мы можем иметь как пустой дикт

5. как будто я в основном анализирую дерево идентификаторов процессов. предположим, что P1-родительский процесс, а P2-дочерний процесс, тогда мне нужно диктовать как {P1: {P2: {}}. и теперь P3 является дочерним для процесса P2. таким образом, он станет {P1: {P2: {P3: {}}

Ответ №2:

 menu = {
    "dinner": {
        "chicken": "good",
        "beef": "average",
        "vegetarian": {
            "tofu": "good",
            "salad": {"caeser": "bad", "italian": "average"},
        },
        "pork": "bad",
    }
}

def menuItems(dict,type,target,keys):
    if(target in dict[type].keys()):
        dict[type][target][keys[0]]=keys[1]
    else:
        dict[type][keys[0]]=keys[1]

menuItems(menu,'dinner','vegitarian',['green_veg','bad'])
print(menu)
 

выход:

 {'dinner': {'chicken': 'good', 'beef': 'average', 'vegetarian': {'tofu': 'good', 'salad': {'caeser': 'bad', 'italian': 'average'}}, 'pork': 'bad', 'green_veg': 'bad'}}
 

теория:

   ->check weather the key exist or not in parent
  ->if exist create a new key with value in that key
  ->else create a key in parent which is type in above code 
 

Я думаю, что это может помочь вам понять основную концепцию словарей на python.