python中最大的子字典的大小

时间:2015-06-02 08:37:01

标签: python pyyaml

我正在使用Python和YAML配置文件。我有一个像这样的YAML结构:

---
structure:
    -
        some: keys
        subsection:
            sub1: val1
            sub2: val2
    -
        some: keys2
        subsection:
            sub1: val21
            sub2: val22
            sub3: val23
            sub4: val24

“小节”的大小不固定,取决于条目。 我正在使用PyYAML将配置作为字典加载到我的python脚本中。 我怎样才能快速检查,最大的“子部分”有多大?那么在这种情况下,我怎样才能发现最大的子部分是四个条目长?有没有巧妙的方法没有迭代它?

谢谢

编辑: 这是python中的最后一个字典:

data = yaml.load(...)
pprint(data)
{'name': 'value',
 'structure': [{'some': 'keys',
                'subsection': {'sub1': 'val1', 'sub2': 'val2'}},
               {'some': 'keys2',
                'precursor': {'sub1': 'val21',
                              'sub2': 'val22',
                              'sub3': 'val23',
                              'sub4': 'val24'}}
               ]}

2 个答案:

答案 0 :(得分:1)

使用内置插件lenmaxgenerator来尝试此操作:

top = {
    "somekey":"somevalue",
    "sub1":
        {"subsub1":1,"subsub2":2},
    "sub2":
        {"subsub1":1,"subsub2":2,"subsub3":3}
}
print max(len(item) for key,item in top.items() if isinstance(item,dict))
#3

您应该检查项目的类型,否则您的顶级键也会返回值,但实际上不是子部分。

答案 1 :(得分:1)

假设您的文字在input.xml文件中

from ruamel.yaml import load

def get_longest(d, max_length=0):
    if isinstance(d, dict):
        try:
            l = len(d['subsection'])
            if l > max_length:
                max_length = l
        except:
            pass  # no key "subsection"
        for val in d.values():
            max_length = get_longest(val, max_length)
    elif isinstance(d, list):
        for item in d:
            max_length = get_longest(item, max_length)
    return max_length

data = load(open('input.yml'))

会打印出4。当然,如果您知道所有“子部分”键都在某个深度,您可以进行优化。上述内容并不指望它们位于序列/映射层次结构中的某个位置或级别。

我使用了我的增强版PyYAML(ruamel.yaml),但为了这个目的,这对旧的PyYAML应该是一样的。

print get_longest(data)