解析Python字典键

1 投票
3 回答
4901 浏览
提问于 2025-04-18 06:03

有没有办法让我能获取一个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'}]

撰写回答