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]
称为
你的目录