#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:
Посмотрите на два примера:
{"green_veg": "bad"}
с родителемvegetarian
, где родитель присутствует в названном словареmenu
.{"green_veg": "bad"}
с родителемgreens
, если родитель отсутствует в названном словареmenu
.- Также приведены примеры процессов.
Вот код:
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.