python-3.x - 如何使用键路径获取字典的值
问题描述
我有2本词典。Dict 1:值是第二个dict的键的路径。
我需要从 get Dict 1 中获取键和值,并使用路径从 Dict 2 中获取值。
字典2:
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"
}
}
}
}
字典1:
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"
}
输出:
对于dict1中的每个键和值,在dict 1中获取dict2中键的值
{"d0_f1" = "s1_v1"}
代码:
def find_in_input_json(element, input_json):
keys = element.split('/')
rv = input_json
for key in keys:
rv = rv[key]
return rv
value = find_in_input_json(key_value, input_json)
print(value)
这给出了一条错误消息
AttributeError: 'dict' object has no attribute 'split'
解决方案
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
)/
分隔 ie'/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']}
推荐阅读
- android - 从 React native/android 上的显示 2 个应用程序图标打开应用程序
- react-native - 身份验证流程 - 本机反应和导航往返
我一直在阅读 React Navigation 身份验证文档,但我似乎无法像示例描述的那样让我的身份验证工作 - https://reactnavigation.org/docs/auth-flow/。
- amazon-web-services - Terraform:有没有办法对应用/销毁的目标(资源)进行分组?
- iis-10 - WinServer 2019 上的 IIS 10 加载 asp.net 页面的速度非常慢,即使在后续加载时也是如此
- go - 恐慌:http:/static/的多个注册
- visual-studio-code - Visual Studio 代码复制工作但不正确
- shell - 如何使用 ksh 提取可变长度子字符串
- jsf - JSF2 的 Inputtext 小部件将不允许用户在 XHTML UI 中输入数据
- angular - Angular mat-list-item routerLink not working
- reactjs - 使用已部署的端点时未找到本机 404 反应