【问题标题】:Accessing nested keys in Python在 Python 中访问嵌套键
【发布时间】:2019-01-16 03:20:34
【问题描述】:

我有一个嵌套字典如下

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'])  

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

【问题讨论】:

  • 为什么你认为它应该返回嵌套键? dict.keys() 方法不这样做。
  • keys 返回字典的键 keys 被调用,并不是字典中任意点包含的所有键。而“Q”是一个恰好在字典中的键,从entry[2]的角度来看,它是values的一部分
  • 那么您希望entry.keys() 返回什么?
  • @taras ,好的..如何在此处访问它们
  • @Karamzov, entry[2]['N']['Q'] 会给你'E'

标签: python dictionary nested


【解决方案1】:

keys()doesn't work that way.

keys()

返回字典键的新视图

您的嵌套字典是一个完全独立的字典,您可以使用自己的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']

【讨论】:

  • ok..是否可以在不使用主键的情况下访问嵌套键值,即这里通过访问 Q 获取 E
【解决方案2】:

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

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

entry[2]

是

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

具有单键'N'和数据'{"Q":{"E"}}'

【讨论】:

  • ok ,所以为了访问嵌套键,你需要创建一个方法
  • @Gunnar 这有助于 OP 理解为什么当前没有返回嵌套键,但是您能否在答案中添加如何访问嵌套键?我相信这是最初的问题。
【解决方案3】:

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

【讨论】:

  • 这是什么isinstance?
  • 它是一个抽象基类(类似于其他语言中的接口)。所以isinstance(d, Mapping) 类似于isinstance(d, dict),除了这也适用于其他映射类型(例如collections 模块中的Counter、defaultdict、OrderedDict 类)
【解决方案4】:

如果您想检查所有嵌套键,您可以创建一个循环函数来检查您查找的数据的类型,如果它是另一个字典,则对其进行迭代,例如

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])

在这里,每当您的字典中的一个键指向另一个字典时,您就递归调用该函数以读取较低级别的字典键。当然,如果您想要这样的列表,您始终可以附加您在列表中找到的键,以便最终由您的函数返回。

【讨论】:

    【解决方案5】:

    仅对于键,使用简单的recorsive function:

    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)
    

    此功能适用于任何嵌套字典

    【讨论】:

      猜你喜欢
      • 2018-02-09
      • 1970-01-01
      • 2017-01-20
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2013-09-29
      • 1970-01-01
      相关资源
      最近更新 更多