【问题标题】:Get keys of a deeply nested dictionary by the nesting level通过嵌套级别获取深度嵌套字典的键
【发布时间】:2022-10-16 23:11:03
【问题描述】:

我有一个多级字典,想象一下:

raw_dict = {'a':{'b':{'c':[1,2,3]}},
            'd':{'e':{'f':{'g':[4,5,6]}}}}

是否可以访问指定嵌套级别的键?

也就是说,有没有办法做类似的事情:

level = 1
keys_level_1 = list([a way to call the dictionary at specified nesting level])
print(keys_level_1)

这将返回

['b', 'e']

this is similar,但不是我想要的。

【问题讨论】:

  • 为什么链接中的答案不是您要搜索的?你只想要keys 而不是key:value 对?
  • 输入到底是什么?在这里你有一组字典,这是无效的python
  • 您的 raw_dict 是无效的 set
  • 我的错,对不起。现在它是正确的。
  • @Rabinzel 在链接中只有当它们的值不是字典时才能获得键。我需要指定级别的所有键(不管值!)。

标签: python dictionary nested


【解决方案1】:

使用递归函数

def get_keys(dct, level):
    
    def get_(d, current=0):
        # check if we're at the level we want, yield if so
        if current==level:
            yield d
        # if not, move down one more level
        else:
            for v in d.values():
                # only move down if the value is a dict
                if isinstance(v, dict):
                    yield from get_(v, current+1)
                    
    return [x for s_l in get_(dct) for x in s_l]

raw_dict = {'a':{'b':{'c':[1,2,3]}},
            'd':{'e':{'f':{'g':[4,5,6]}}}}

get_keys(raw_dict, 0)
['a', 'd']
get_keys(raw_dict, 1)
['b', 'e']
get_keys(raw_dict, 2)
['c', 'f']
get_keys(raw_dict, 3)
['g']

【讨论】:

    【解决方案2】:

    使用递归函数的一种可能性:

    raw_dict = {'a':{'b':{'c':[1,2,3]}},
                'd':{'e':{'f':{'g':[4,5,6]}}}}
    
    def get_level(d, level):
        from itertools import chain
        
        if level == 0:
            return list(d)
        else:
            return list(chain.from_iterable(get_level(d[item], level=level-1)
                              for item in d if isinstance(d[item], dict)))
    
    get_level(raw_dict, level=1)
    

    输出:['b', 'e']

    其他例子:

    get_level(raw_dict, level=0)
    ['a', 'd']
    
    get_level(raw_dict, level=1)
    ['b', 'e']
    
    get_level(raw_dict, level=2)
    ['c', 'f']
    
    get_level(raw_dict, level=3)
    ['g']
    
    get_level(raw_dict, level=4)
    []
    

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 2021-05-10
      • 1970-01-01
      • 2011-02-01
      • 2016-01-07
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多