解析Python字典键
有没有办法让我能获取一个pickle字典的完整结构?
假设我有这个pickle文件:
{
'9': {
'Dual': {
'spectrum' : ...,
'interferogram': ...,
'SNR': ...
},
'Top': {
'spectrum' : ...,
'interferogram': ...,
'SNR': ...
},
'Bottom': {
'spectrum' : ...,
'interferogram': ...,
'SNR': ...
}
},
'10': ...,
'11': ...
}
我想要一个快捷方式,可以查看这个pickle文件里的所有键,而不用像这样做:
lvl1 = dictionary.keys()
lvl2 = dictionary['9'].keys()
lvl3 = dictionary['9']['Dual'].keys()
因为我事先不知道pickle文件里面的键,但我知道它有3个层级。
我想以某种方式获取字典的不同层级,像这样:
lvl1.keys() = {'9','10','11'}
lvl2.keys() = {'Dual', 'Top', 'Bottom'}
lvl3.keys() = {'spectrum', 'interferogram', 'SNR'}
谢谢!
3 个回答
0
如果每一层的键都是一样的,比如说9和10的键是一样的,Dual和Top的键也是一样的,你可以这样做:
lvl1 = dictionary.keys()
lvl2 = dictionary[lvl1[0]].keys()
lvl3 = dictionary[lvl1[0]][lvl2[0]].keys()
这样做就不需要事先知道具体的键值是什么了。
0
我觉得没有办法不遍历所有内容来做到这一点,不过这里有一种方法,可以用不太复杂的代码来实现:
level_1_keys = [k1 for k1 in dictionary.keys()]
level_2_keys = []
level_3_keys = []
for v1 in dictionary.values():
level_2_keys += [k2 for k2 in v1.keys()]
for v2 in v.values():
level_3_keys += [k3 for k3 in v2.keys()]
补充:Lattyware 提出的递归解决方案也很不错,可以更普遍地解决这个问题。你也可以用一些复杂的循环来实现一个通用的解决方案,但那样可能就有点多余了。
1
如果你愿意假设结构在整个过程中都是一样的,那么这个问题就有一个很自然的递归解决方案:
def layers(data):
try:
keys = [data.keys()]
except ValueError:
return
rest = layers(next(iter(data.values())))
return keys + rest if rest else keys
或者在3.x版本中:
from collections.abc import Mapping
def layers(data):
if isinstance(data, Mapping):
yield data.keys()
yield from layers(next(data.values()))
这个解决方案的好处是,你不需要知道有多少层。
[{'9','10','11'}, {'Dual', 'Top', 'Bottom'}, {'spectrum', 'interferogram', 'SNR'}]