繁体   English   中英

从 python 中的嵌套字典中获取所有值

[英]Get all values from nested dictionaries in python

我有一些字典的字典,像这样:

a['b']['c']['d']['answer'] = answer1
a['b']['c']['e']['answer'] = answer2
a['b']['c']['f']['answer'] = answer3
....
a['b']['c']['d']['conf'] = conf1
a['b']['c']['e']['conf'] = conf2
a['b']['c']['f']['conf'] = conf3

有没有一种快速的方法来获取第三级(d,e,f)所有元素的所有答案的值列表?

具体来说,我想知道是否有任何实现通配符的机制(例如, a['b']['c']['*']['answer'].values()

更新到目前为止我发现的最快方法是:

[x['answer'] for x in a['b']['c'].values()]

在Python3中,我们可以为此构建一个简单的生成器:

def NestedDictValues(d):
  for v in d.values():
    if isinstance(v, dict):
      yield from NestedDictValues(v)
    else:
      yield v

a={4:1,6:2,7:{8:3,9:4,5:{10:5},2:6,6:{2:7,1:8}}}
list(NestedDictValues(a))

输出是:

[1, 2, 3, 4, 6, 5, 8, 7]

这是所有的价值观。

您可以使用简单的列表理解:

[a['b']['c'][key]['answer'] for key in a['b']['c'].keys()]
Out[11]: ['answer1', 'answer2', 'answer3']

如果你想得到所有的答案和conf等你可以这样做:

[[a['b']['c'][key][type] for key in a['b']['c'].keys()] for type in a['b']['c']['d'].keys()]
Out[15]: [['conf1', 'conf2', 'conf3'], ['answer1', 'answer2', 'answer3']]

我会使用递归生成器函数来做到这一点:

def d_values(d, depth):
    if depth == 1:
        for i in d.values():
            yield i
    else:
        for v in d.values():
            if isinstance(v, dict):
                for i in d_values(v, depth-1):
                    yield i

例:

>>> list(d_values({1: {2: 3, 4: 5}}, 2))
[3, 5]

在你的情况下,这将为每个项目提供一个字典,如{'answer': answer1, 'conf': conf1} ,因此您可以使用:

list(d['answer'] for d in d_values(a, 3))

只是为了回答这个主题,从我的问题的“更新状态”中复制我的解决方案:

[x['answer'] for x in a['b']['c'].values()]

希望这可以提供帮助。

list(map(lambda key:  a['b']['c'][key],  a['b']['c'].keys()))

您可以使用NestedDict 首先,让我重新创建你的字典

>>> from ndicts.ndicts import NestedDict
>>> nd = NestedDict.from_product("b", "c", "def", ["answer", "conf"])
NestedDict({
    'b': {
        'c': {
            'd': {'answer': None, 'conf': None}, 
            'e': {'answer': None, 'conf': None}, 
            'f': {'answer': None, 'conf': None}
         }
     }
})

然后使用空字符串作为通配符

>>> nd_extract = nd.extract["b", "c", "", "answer"]
>>> nd_extract
NestedDict({
    'b': {
        'c': {
            'd': {'answer': None}, 
            'e': {'answer': None}, 
            'f': {'answer': None}
        }
    }
})

最终得到值

>>> list(nd_extract.values())
[None, None, None]

安装ndicts

pip install ndicts

暂无
暂无

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

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