提问人:Saheen AHZAN 提问时间:4/6/2023 最后编辑:Mark TolonenSaheen AHZAN 更新时间:4/6/2023 访问量:1317
从 Python 中的多个嵌套字典中动态提取值的函数
Function to dynamically extract values from multiple nested dictionary in Python
问:
问题陈述是编写一个函数,该函数将接受输入字典对象并返回所有值的列表,即使在输入字典对象中存在多级嵌套字典的情况下也是如此。
下面是此类嵌套字典的示例:
{
"f_name": "AKASH",
"s_name": "NASH",
"professional": {
"designation": "DE",
"company": "XYZ",
"place_of_work": {
"city": "BLR",
"state": "KA",
"country": "IN"
}
},
"personal_address": {
"city": "EKM",
"state": "KL",
"country": "IN"
}
}
我确实编写了以下代码,并且我能够提取字典值,即使有一个嵌套字典,也可以通过手动条件if语句。
def dic_values(x):
l =[]
l1 = []
if type(x) == dict:
for i in x:
if type(x[i]) != dict:
l.append(x[i])
elif type(x[i])== dict:
y = x[i]
for j in y:
l1.append(y[j])
else:
"Please input a dict object"
l.extend(l1)
return l
案例 1:使用带有一个嵌套字典的 dict 对象运行函数时:
dic_values({"name":"AKASH","s_name":"NASH", "place":{"city":"BLR","state":"KA","country":"IN"}})
预期输出:
['AKASH', 'NASH', 'BLR', 'KA', 'IN']
案例 2:与下面的示例一样,在内部输入多级嵌套字典:
dic_values({"f_name":"AKASH","s_name":"NASH","professional":{"designation":"DE","company":"XYZ","place_of_work":{"city":"BLR","state":"KA","country":"IN"}}, "personal_address":{"city":"EKM","state":"KL","country":"IN"}})
输出:
['AKASH','NASH','DE','XYZ', {'city': 'BLR', 'state': 'KA', 'country': 'IN'}, 'EKM', 'KL', 'IN']
预期输出:
['AKASH','NASH','DE','XYZ', 'BLR', 'KA', 'IN', 'EKM', 'KL', 'IN']
问题:
假设输入字典对象中存在嵌套字典。我想编写一个代码,其中代码动态检查多级嵌套字典的存在并执行。就像 CASE 2 预期输出一样。
答:
-1赞
Davi A. Sampaio
4/6/2023
#1
def all_dict_values(input_dict):
result = []
for value in input_dict.values():
if isinstance(value, dict):
result.extend(all_dict_values(value))
else:
result.append(value)
return result
评论
1赞
Saheen AHZAN
4/6/2023
谢谢你的回答。真的帮助解决了我的问题,并理解了一个新函数 isinstamce()
0赞
Phoenix
4/6/2023
#2
修改现有代码以递归方式调用dic_values:
def dic_values(x):
if not isinstance(x, dict):
return [x]
res = []
for v in x.values():
res.extend(dic_values(v))
return [v for v in res if not isinstance(v, dict)]
评论
0赞
Saheen AHZAN
4/6/2023
谢谢你的回答。成功了。尽管对于像我这样的 n00b 来说,另一个答案更容易理解。珍惜你的时间。
0赞
Phoenix
4/6/2023
欢迎您,感谢您的点赞
0赞
Saheen AHZAN
4/6/2023
但愿。我是 StackOverflow 的新手,我还没有任何声誉。一旦我得到一些,肯定会这样做。
0赞
Mark
4/6/2023
#3
如果您有兴趣以非递归方式执行此操作。您可以随时维护一堆字典。只要堆栈中有字典,就可以查找更多值:
def dic_values(d):
assert isinstance(d, dict), "Please pass a dict"
values = [] # this will hold the values
stack = [d] # this should only contain dicts
while stack:
next_d = stack.pop()
for v in next_d.values():
if isinstance(v, dict):
stack.append(v) # put it back to process more
else:
values.append(v) # this a not dict, add it to the return list
return values
dic_values({"f_name":"AKASH","s_name":"NASH","professional":{"designation":"DE","company":"XYZ","place_of_work":{"city":"BLR","state":"KA","country":"IN"}}, "personal_address":{"city":"EKM","state":"KL","country":"IN"}})
# ['AKASH', 'NASH', 'EKM', 'KL', 'IN', 'DE', 'XYZ', 'BLR', 'KA', 'IN']
评论
1赞
Saheen AHZAN
4/6/2023
很棒的帮助。精彩的解释。谢谢马克:)
评论
dic_values