在Python中访问嵌套键

时间:2018-08-08 18:54:19

标签: python dictionary nested

我有一个嵌套的字典,如下所示

entry = {
    0: {"Q": 0},
    1: {"W": 2, "E": 3, "N": 5, "S": 4, "Q": 0},
    2: {
        "N": {
            "Q": {"E"}
        }
    },
}

当我尝试仅访问密钥1的密钥时,得到以下信息:

>>> print(entry[1].keys())
dict_keys(['W', 'E', 'N', 'S', 'Q'])

但是对于键2,它仅返回顶部键,而不返回嵌套键。

>>> print(entry[2].keys())
dict_keys(['N'])  

为什么它不返回字典的嵌套键?

5 个答案:

答案 0 :(得分:2)

keys()doesn't work that way.

  

键()

     

返回字典键的新视图

您的嵌套字典是一个完全独立的字典,您可以使用自己的keys()方法获取其自己的键:

entry[2]['N'].keys()

如果您想递归地获取嵌套字典中的所有键,则必须为此实现一个方法:

entry = {0: {"Q": 0},
         1: {"W": 2, "E": 3, "N": 5, "S": 4, "Q": 0},
         2: {"N": { "Q":{"E"}}},
}


def rec_keys(dictio):
    keys = []
    for (key,value) in dictio.items():
        if isinstance(value, dict):
            keys.extend(rec_keys(value))
        else:
            keys.append(key)
    return keys

print(rec_keys(entry))
# ['Q', 'Q', 'W', 'N', 'S', 'E', 'Q']

答案 1 :(得分:1)

运行print(entry[2].keys())

您正在问python“与键'2'对应的数据中存在哪些键?(在您的情况下,这是另一本字典)”的答案只是'N'。这是因为

entry[2]

{"N": { "Q":{"E"}}

具有单个键“ N”和数据“ {“ Q”:{“ E”}}'

答案 2 :(得分:1)

dict.keys仅返回字典的顶级键。如果要获取字典的所有嵌套键,则需要定义自己的函数。

# interface for dictionary-like objects
from collections.abc import Mapping

def nested_keys(d) -> set:
    """
    Return a set containing all nested keys.
    """
    # If it is not a dict-like object, return an empty set
    if not isinstance(d, Mapping):
        return set()

    keys = d.keys()
    for v in d.values():
        # Update the keys set with the keys in each value by using the union (or) operator: |
        keys |= nested_keys(v)

    return keys

答案 3 :(得分:1)

如果要检查所有嵌套键,则可以创建一个循环函数,该函数检查查找的数据的类型,并在它是另一个字典(例如,

)时对其进行迭代
def print_nested_keys(d):
    for k in d.keys():
        print(k)
        if type(d[k]) == dict:
            print('nested dict detected - recursing...')
            print_nested_keys(d[k])

在这里,每当词典中的键之一指向另一本词典时,您都将递归调用此函数以读取较低级的词典键。当然,如果需要这样的列表,您总是可以附加在列表中找到的键,最后由您的函数返回。

答案 4 :(得分:0)

对于,使用简单的recorsive函数:

def recursive_items(dict_name):
    for key, value in a.items():
        if type(value) is dict:
            yield (key)
            yield from recursive_items(value)

# print the keys 
for key in recursive_items(a):
   print(key)

这个函数对任何嵌套字典都有好处