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

Posted

技术标签:

【中文标题】从python中的嵌套字典中获取所有值【英文标题】:Get all values from nested dictionaries in python 【发布时间】:2014-07-21 19:18:48 【问题描述】:

我有一些词典,像这样:

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

【问题讨论】:

您在update 中的解决方案是最好的方法。 python 中的dict 实现为哈希表。它实际上对keys 的内容一无所知,只知道它们的哈希值。因此,除了你刚才的做法之外,没有办法合理地实现通配符。或者,换句话说,values() 本质上已经相当于 '*' 作为键(在正则表达式的意义上),而您要做的其余事情只是列出组合。 正是,所以没有那样的事情...... :( 嗯,这会很方便。无论如何,非常感谢您的评论! 另外,如果您使用的是 python 2.7,请使用 itervalues 而不是 values。第一个返回一个惰性求值的生成器,而第二个实际上分配了一个列表。 Python 3 将 values 转换为 itervalues 并让您执行 list(dict.values()) 以获取列表。 【参考方案1】:

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

这是所有的值。

【讨论】:

【参考方案2】:

您可以使用简单的列表推导:

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

【讨论】:

【参考方案3】:

我会使用递归生成器函数:

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

【讨论】:

不适合 OP,但适合我。很小的变化,它对于获取大型嵌套字典的所有最后元素很有用【参考方案4】:

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

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

希望这能有所帮助。

【讨论】:

【参考方案5】:
list(map(lambda key:  a['b']['c'][key],  a['b']['c'].keys()))

【讨论】:

请尝试用您的代码提供一些解释(用几句话)。

以上是关于从python中的嵌套字典中获取所有值的主要内容,如果未能解决你的问题,请参考以下文章

从Hashmap的所有值中获取所有嵌套项

提取嵌套字典python中的所有组合[关闭]

如何从 Python Pandas Dataframe 中的 STRING 列中提取嵌套字典?

Python 3:扁平化嵌套字典和字典中的列表

如何一次对字典或列表中的所有嵌套字典和列表进行排序?

如何在 Python 中直接获取字典键作为变量(而不是通过从值中搜索)?