2015-06-02 3 views
0

Я использую Python с конфигурационными файлами YAML. У меня есть YAML структура вроде этого:Размер самого большого подъязыка в python

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

Размер «части» не фиксируется и зависит от записи. Я загружаю конфигурацию с PyYAML в свой скрипт python в качестве словаря. Как я могу быстро проверить, насколько велика самая большая «подразделение»? Итак, в этом случае, как я могу узнать, что самый большой подраздел состоит из четырех записей? Есть ли разумный способ без итерации?

Спасибо

Edit: Вот конечный словарь в 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'}} 
       ]} 
+0

Как выглядит словарь? – ZdaR

+0

данные ["structure"] [{"some": "keys", "subsection": {...}}, {"some": "keys2", "subsection": {...}}] –

+0

It до сих пор неясно, приложите образец словаря в свой вопрос – ZdaR

ответ

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) 
+0

Отлично! спасибо –

1

Попробуйте со встроенными модулями len, max и generator:

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 

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

Смежные вопросы