获取Python嵌套字典中的所有值

21 投票
6 回答
36115 浏览
提问于 2025-04-18 08:11

我有一些字典里面又包含字典,像这样:

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

6 个回答

0

在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解和使用这些数据,我们通常需要把它们转换成一种特定的格式。

比如说,如果我们从一个网站获取了一些信息,这些信息可能是以文本的形式存在的。为了让程序能够更方便地使用这些信息,我们可能需要把它们转换成一个对象,这样就可以通过对象的属性来访问这些数据了。

在这个过程中,我们可能会用到一些工具或者库,这些工具可以帮助我们更轻松地进行数据转换。使用这些工具,我们可以减少手动处理数据的麻烦,让程序更加高效。

总之,数据转换是编程中一个很重要的环节,它帮助我们把不同来源的数据变得易于使用。

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

我会使用递归生成器函数来实现这个功能:

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

你可以使用一个简单的列表推导式:

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

如果你想获取所有的答案和相关内容等,你可以这样做:

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

在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}}}
print(list(NestedDictValues(a)))

输出结果是:

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

这就是所有的值。

0

我来给这个话题提供一个答案,把我在“更新状态”中提到的解决方案复制过来:

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

希望这能帮到你。

撰写回答