繁体   English   中英

检查整个列表中是否存在键或python中的字典

[英]Check a key exist in entire list or dict in python

我在python中创建字典,该字典可能包括列表和子字典。 如果我想先检查某个字典中是否存在某个密钥,那么我要查询该字典,然后只有我才能检查该密钥是否存在。 但是有什么方法可以使用父级dict检查密钥是否存在,仅意味着如果父级dict有子级dict,然后搜索到每个级别,让我知道密钥是否存在于整个dict中,然后可以使用该密钥在包含该键的字典中插入或删除元素。

例如,我有这个

[
    {
        'groupName': u'MainMenu_1',
        'menuItems': [
            {
                'action': u'/home\r\n',
                'sub_1': [

                ],
                'id': 1L,
                'name': u'Home\r\n'
            },
            {
                'action': u'/inventory',
                'sub_2': [

                ],
                'id': 2L,
                'name': u'Inventory\r\n'
            },
            {
                'action': u'/accounting\r\n',
                'sub_3': [
                    {
                        'action': u'/gl\r\n',
                        'name': u'GL\r\n',
                        'sub_4': [

                        ]
                    },
                    {
                        'action': u'/ap\r\n',
                        'name': u'AP\r\n',
                        'sub_5': [

                        ]
                    },
                    {
                        'action': u'/ar\r\n',
                        'sub_6': [

                        ],
                        'name': u'AR\r\n'
                    }
                ],
                'id': 3L,
                'name': u'Accounting\r\n'
            },
            {
                'action': u'/crm\r\n',
                'sub_8': [

                ],
                'id': 8L,
                'name': u'CRM\r\n'
            }
        ]
    },
    {
        'groupName': u'MainMenu_2',
        'menuItems': [
            {
                'action': u'/iv-receive\r\n',
                'sub_9': [

                ],
                'id': 9L,
                'name': u'Receiving\r\n'
            },
            {
                'action': u'/iv-shipping\r\n',
                'sub_10': [

                ],
                'id': 10L,
                'name': u'Shipping\r\n'
            }
        ]
    }
]

现在,如果在上面的示例中,我想搜索诸如sub_1,sub_3,sub_6之类的任何键,那么我如何搜索该键

我们可以递归搜索所有符合条件的词典。 以下实现将此类词典的所有引用附加到found的列表found

def recursive_search(items, key):
    found = []
    for item in items:
        if isinstance(item, list):
            found += recursive_search(item, key)
        elif isinstance(item, dict):
            if key in item:
                found.append(item)
            found += recursive_search(item.values(), key)
    return found

found = recursive_search(items, 'sub_9')
def flatten(obj):
    if isinstance(obj, list):
        result = set()
        for e in obj:
            result = result.union(flatten(e))
        return result
    elif isinstance(obj, dict):
        return set(obj.keys()) | flatten(obj.values())
    else:
        return {obj}

您也可以将列表/词典拼合为一组,并根据需要快速进行多次搜索。

print(flatten(lst))
set([1, 2, 3, u'/inventory', 8, 9, 'menuItems', u'/home\r\n', u'/ar\r\n', u'AP\r\n', u'/accounting\r\n', 'id', u'MainMenu_2', u'Receiving\r\n', u'Home\r\n', u'MainMenu_1', u'/iv-shipping\r\n', 'groupName', 10, u'AR\r\n', u'Accounting\r\n', u'/ap\r\n', u'Inventory\r\n', u'CRM\r\n', u'/crm\r\n', u'/iv-receive\r\n', 'sub_10', u'GL\r\n', u'Shipping\r\n', 'name', 'sub_2', 'sub_3', 'sub_1', 'sub_6', 'sub_4', 'sub_5', 'action', 'sub_8', 'sub_9', u'/gl\r\n'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM