Python 如何迭代嵌套字典中的第n个位置
我有一本长度不固定的嵌套字典Python 如何迭代嵌套字典中的第n个位置,python,json,python-3.x,dictionary,Python,Json,Python 3.x,Dictionary,我有一本长度不固定的嵌套字典 [{'name': 'stack', 'children': [{'name': 'flow', 'children': [{'name': 'lldp', 'children': [{'name': 'sourc', 'children': [{'name': 'lldque.jrc', 'count': '11', 'size': '37'}]}]}, {'name': 'arp', 'children': [{'name': 'src', 'children'
[{'name': 'stack', 'children': [{'name': 'flow', 'children': [{'name': 'lldp', 'children': [{'name': 'sourc', 'children': [{'name': 'lldque.jrc', 'count': '11', 'size': '37'}]}]}, {'name': 'arp', 'children': [{'name': 'src', 'children': [{'name': 'arpred.cec', 'count': '37', 'size': '67'}]}]}]}]}]
我想从dict访问最后一个dict键(“计数”和“大小”)
我试过下面的功能,但效果不好
def get_value(your_dict,*keys):
curr_dict = your_dict
for k in keys:
v = curr_dict.get(k,None)
if v is None:
break
if isinstance(v,dict):
curr_dict = v
return v
您可以递归地获取它们:
from itertools import chain
def get_value(your_dict,*keys):
if "children" in your_dict:
return tuple(
chain.from_iterable(
get_value(d, *keys) for d in your_dict["children"]
)
)
return tuple(your_dict[k] for k in keys if k in your_dict)
这里有一个您有一个递归dict,所以您可能需要使用递归。试试这个:
def get_value(d):
if 'count' in d and 'size' in d:
return d['count'], d['size']
elif 'children' in d:
return get_value['children']
注意,这将只返回它找到的第一个元素的计数和大小。您可以轻松地让它检查名称。它返回
None
如果没有找到叶节点我们可以创建一些递归函数来搜索键
,如下所示:
def search_data_key(data, key):
if key in data:
yield data[key]
for k in data:
if isinstance(data[k], list):
for i in data[k]:
for j in search_data_key(i, key):
yield j
data = [{'name': 'stack', 'children': [{'name': 'flow', 'children': [{'name': 'lldp', 'children': [{'name': 'sourc', 'children': [{'name': 'lldque.jrc', 'count': '11', 'size': '37'}]}]}, {'name': 'arp', 'children': [{'name': 'src', 'children': [{'name': 'arpred.cec', 'count': '37', 'size': '67'}]}]}]}]}]
print(list(search_data_key(data[0], 'count')))
print(list(search_data_key(data[0], 'size')))
output:
['11', '37']
['37', '67']
这是一个递归扫描结构的通用实现,如果它是
dict
def find_key_in_nested(struct, key, result_list):
# Check if it is a list and loop over all elements
if type(struct) == list:
for it in struct:
element = find_key_in_nested(it, key, result_list)
if element:
result_list.append(element)
# Check if it is a dict
if type(struct) == dict:
if key in struct.keys(): # It has the required key! Append
return result_list.append(struct[key])
# It doesn't have it, keep looking further down
for k in struct.keys():
element = find_key_in_nested(struct[k], key, result_list)
if element:
result_list.append(element)
它将结果附加到一个列表中
,因此您可以像这样调用它
my_list = []
find_key_in_nested(my_dict, 'size', my_list)
print(my_list)
output:
['37', '67']
您发布的是一个
列表
。我想你是把你的清单[0]
称为你的目录
?