New answer
- (Final updated)
@ vartika, спасибо за обновление проблемы с желаемым i / p & o / p, поскольку это помогло мне помочь вам.
Вы можете использовать приведенный ниже код для выполнения задачи или решения этой проблемы.Я закомментировал несколько строк, чтобы прояснить мои соображения, и я думаю, что код понятен и прост для понимания.
Вы можете комментировать, если обнаружите какие-либо трудности.
def find_in_input_json(element, input_json):
values = {} # Output dictionary with key in dict1: matched value
for d_f in dict1:
path = dict1[d_f] # "s0/s1/s1_f1"
paths = path.split('/') # ['s0', 's1', 's1_f1']
rv = input_json
for s in paths: # s: s0 -> s1 -> s1_f1 (one by one)
if s in rv:
rv = rv[s] # Update input_json with new dictionary pointed by current matched key
values[d_f] = rv # {'d0_f1': 's1_v1'} -> {'d0_f1': 's1_v1', 'd3_f1': 's3_v1'} -> so...on
return values
if __name__ == '__main__':
dict1 = {
"d0_f1": "s0/s1/s1_f1",
"d3_f1": "s0/s2/s2_f3/s3_f1",
"d1_f1": "s0/s2/s2_f1",
"d1_f2": "s0/s2/s2_f2"
}
dict2 = {
"s0": {
"s1": {
"s1_f1": "s1_v1",
"s1_f2": "s1_v2"
},
"s2": {
"s2_f1": "s2_v1",
"s2_f2": "s2_v2",
"s2_f3": {
"s3_f1": "s3_v1"
}
}
}
}
values = find_in_input_json(dict1, dict2)
print(values) # {'d0_f1': 's1_v1', 'd3_f1': 's3_v1', 'd1_f1': 's2_v1', 'd1_f2': 's2_v2'}
Old answer
@ vartika, как я понял из проблемы и комментариев, у вас есть вложенный словарь с любым списком в нем.
Так что я просторассмотрим следующий список.
Здесь я создал 2 словаря, key_value
& input_json
.
Внутри функции, я делаю следующие операции.
Получить значение ключа element
в словаре key_value
.
element
- это строка (path
) /
, разделенная, т. Е. '/Users/hygull/Desktop/Python3/file1/output'
, так что использование метода split()
здесь хорошо, как вы использовали в своем коде.
Наконец, я перебираю элементы пути и также проверяю, является ли этот элемент пути ключомв input_json
.Если он захватывает соответствующее значение и выходит из цикла.
Возвращает значение вызывающей стороне.
Теперь вы можете взглянуть на приведенный ниже код.
def find_in_input_json(element, input_json):
# Fetch element keys value
element = element['file']["element"] # '/Users/hygull/Desktop/Python3/file1/output'
keys = element.split('/')
print(keys) # ['', 'Users', 'hygull', 'Desktop', 'Python3', 'file2', 'output']
rv = input_json
for key in keys:
if key in rv: # 'file2' key is in input_json
rv = rv[key] # Get its value
break # Exit from loop, don't go further
return rv # Return the value
if __name__ == '__main__':
# TEST CASE 1
key_value = {
'file': {
'name': 'a.py',
'element': '/Users/hygull/Desktop/Python3/file2/output',
'children': [
'b.py',
'c.py'
]
}
}
input_json = {
'file1': {
'name': 'a.py',
'element': '/Users/hygull/Desktop/Python3/file2/output',
'children': [
'b.py',
'c.py'
]
},
'file2': {
'name': 'c.py',
'element': '/Users/hygull/Desktop/Python3/file1/output',
'children': [
'd.py',
'e.py'
]
},
'file3': {
'name': 'x.py',
'element': '/Users/hygull/Desktop/Python3/file4/output',
'children': [
'y.py',
'z.py'
]
}
}
value = find_in_input_json(key_value, input_json)
print(value) # {'name': 'c.py', 'element': '/Users/hygull/Desktop/Python3/file1/output', 'children': ['d.py', 'e.py']}