获取嵌套字典中所有键的列表

5

我想获取包含列表和字典的嵌套字典中所有键的列表。

我目前有这段代码,但似乎漏掉了一些键添加到列表中,同时也重复添加了一些键。

keys_list = []
def get_keys(d_or_l, keys_list):
    if isinstance(d_or_l, dict):
        for k, v in iter(sorted(d_or_l.iteritems())):
            if isinstance(v, list):
                get_keys(v, keys_list)
            elif isinstance(v, dict):
                get_keys(v, keys_list)
            else:
                keys_list.append(k)
    elif isinstance(d_or_l, list):
        for i in d_or_l:
            if isinstance(i, list):
                get_keys(i, keys_list)
            elif isinstance(i, dict):
                get_keys(i, keys_list)
    else:
        print "** Skipping item of type: {}".format(type(d_or_l))
    return keys_list

这只需要一个空列表,并用键填充它。d_or_l是一个变量,并将原始字典与之进行比较。


1
如果在不同的目录中有相同的键,您想要怎么做? - Serge Ballesta
不需要考虑键是否相同。我需要这个来对比不同字典中的键,以进行比较。去除重复值并不好。 - GatesOfDelirium
5个回答

7
这应该可以完成工作:
def get_keys(dl, keys_list):
    if isinstance(dl, dict):
        keys_list += dl.keys()
        map(lambda x: get_keys(x, keys_list), dl.values())
    elif isinstance(dl, list):
        map(lambda x: get_keys(x, keys_list), dl)

为了避免重复,您可以使用set,例如:

为了避免重复,您可以使用set,例如:

keys_list = list( set( keys_list ) )

例子测试用例:

keys_list = []
d = {1: 2, 3: 4, 5: [{7: {9: 1}}]}
get_keys(d, keys_list)
print keys_list
>>>> [1, 3, 5, 7, 9]

这只在Py2中有效吗? - gustavz

5

目前,你的代码忽略了指向 listdict 的键。在第一个 for 循环中删除 else 块,无论值是什么,你都想要添加该键。

keys_list = []
def get_keys(d_or_l, keys_list):
    if isinstance(d_or_l, dict):
        for k, v in iter(sorted(d_or_l.iteritems())):
            if isinstance(v, list):
                get_keys(v, keys_list)
            elif isinstance(v, dict):
                get_keys(v, keys_list)
            keys_list.append(k)   #  Altered line
    elif isinstance(d_or_l, list):
        for i in d_or_l:
            if isinstance(i, list):
                get_keys(i, keys_list)
            elif isinstance(i, dict):
                get_keys(i, keys_list)
    else:
        print "** Skipping item of type: {}".format(type(d_or_l))
    return keys_list

get_keys({1: 2, 3: 4, 5: [{7: {9: 1}}]}, keys_list) 返回 [1, 3, 9, 7, 5]

为避免重复,你可以使用 set 数据类型 而不是 list


不适用于包含列表和字典的字典,例如{1: 2, 3: 4, 5: [{7: {9: 1}}]}。 - pm007
@pm7 在我的环境中它可以工作,我会发布我使用的完整代码。 - MackM

1
这里是一个简单的解决方案:
def get_nested_keys(d, keys):
    for k, v in d.items():
        if isinstance(v, dict):
            get_nested_keys(v, keys)
        else:
            keys.append(k)

keys_list = []
get_nested_keys(test_listing, keys_list)
print(keys_list)

如果您想了解键的层次结构,可以修改函数如下:
def get_nested_keys(d, keys, prefix):
    for k, v in d.items():
        if isinstance(v, dict):
            get_nested_keys(v, keys, f'{prefix}:{k}')
        else:
            keys.append(f'{prefix}:{k}')

1
我会通过以下Python 2和3兼容版本来扩展@pm007的回答:
def get_keys(dl, keys=None):
    keys = keys or []
    if isinstance(dl, dict):
        keys += dl.keys()
        _ = [get_keys(x, keys) for x in dl.values()]
    elif isinstance(dl, list):
        _ = [get_keys(x, keys) for x in dl]
    return list(set(keys))

d = {1: 2, 3: 4, 5: {7: {1: 1}}}
get_keys(d)

此外,这种方式更加方便,因为您可以获得返回所需键的函数,而不是神奇地改变列表。

0

将@MackM的回答更新为Python 3,因为 dict.iteritems 已被弃用(而我更喜欢使用f-字符串而不是 .format {} ):

keys_list = []
def get_keys(d_or_l, keys_list):
    if isinstance(d_or_l, dict):
        for k, v in iter(sorted(d_or_l.items())):  #  Altered line to update deprecated method
            if isinstance(v, list):
                get_keys(v, keys_list)
            elif isinstance(v, dict):
                get_keys(v, keys_list)
            keys_list.append(k)   
    elif isinstance(d_or_l, list):
        for i in d_or_l:
            if isinstance(i, list):
                get_keys(i, keys_list)
            elif isinstance(i, dict):
                get_keys(i, keys_list)
    else:
        print(f'** Skipping item of type: {type(d_or_l)}')  #  Altered line to use f-strings
    return keys_list


unique_keys = list(set(get_keys(my_json_dict, keys_list)))  # Added line as example use case

如何处理获取层次结构?即 https://stackoverflow.com/questions/75078908/python-get-all-keys-dot-separated-hierarchy-from-a-nested-dict-of-other-lists - tooptoop4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接