python 中最大子词典的大小
Size of largest sub-dictionary in python
我正在使用 Python 和 YAML 配置文件。我有一个像这样的 YAML 结构:
---
structure:
-
some: keys
subsection:
sub1: val1
sub2: val2
-
some: keys2
subsection:
sub1: val21
sub2: val22
sub3: val23
sub4: val24
"subsection" 的大小不固定,取决于条目。
我将使用 PyYAML 的配置作为字典加载到我的 python 脚本中。
我怎样才能快速检查最大的 "subsection" 有多大?那么在这种情况下,我如何才能发现最大的小节有四个条目长?有没有不用迭代的聪明方法?
谢谢
编辑:
这是 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'}}
]}
用内置函数试试这个 len, max and a 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
您应该检查项目的类型,否则您的顶级键也会 return 值,但实际上不是子部分。
假设您的文本在文件中 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
。当然,如果您知道所有 'subsection' 键都处于某个深度,则可以进行优化。以上并不期望它们位于 sequence/mapping 层次结构中的某个位置或级别。
我使用了我的增强版 PyYAML (ruamel.yaml),但为此目的,它应该与旧版 PyYAML 相同。
print get_longest(data)
我正在使用 Python 和 YAML 配置文件。我有一个像这样的 YAML 结构:
---
structure:
-
some: keys
subsection:
sub1: val1
sub2: val2
-
some: keys2
subsection:
sub1: val21
sub2: val22
sub3: val23
sub4: val24
"subsection" 的大小不固定,取决于条目。 我将使用 PyYAML 的配置作为字典加载到我的 python 脚本中。 我怎样才能快速检查最大的 "subsection" 有多大?那么在这种情况下,我如何才能发现最大的小节有四个条目长?有没有不用迭代的聪明方法?
谢谢
编辑: 这是 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'}}
]}
用内置函数试试这个 len, max and a 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
您应该检查项目的类型,否则您的顶级键也会 return 值,但实际上不是子部分。
假设您的文本在文件中 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
。当然,如果您知道所有 'subsection' 键都处于某个深度,则可以进行优化。以上并不期望它们位于 sequence/mapping 层次结构中的某个位置或级别。
我使用了我的增强版 PyYAML (ruamel.yaml),但为此目的,它应该与旧版 PyYAML 相同。
print get_longest(data)