Размер самого большого под-словаря в Python

Я использую 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 ответа

Решение

Если у вас есть текст в файле 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)

Попробуйте это с помощью встроенных модулей len, max и генератора:

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

Вы должны проверить тип элементов, потому что в противном случае ваши ключи верхнего уровня также будут возвращать значения, но на самом деле не являются подразделами.

Другие вопросы по тегам