我有一些字典词典,如下:
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()]
答案 0 :(得分:10)
在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]
这是所有的值。
答案 1 :(得分:3)
您可以使用简单的列表理解:
[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']]
答案 2 :(得分: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))
答案 3 :(得分:0)
只是回答这个话题,将我的解决方案从我的问题的“更新状态”中复制出来:
[x['answer'] for x in a['b']['c'].values()]
希望这可以提供帮助。
答案 4 :(得分:0)
list(map(lambda key: a['b']['c'][key], a['b']['c'].keys()))