Python - 嵌套字典中的最大值键,泛化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python - 嵌套字典中的最大值键,泛化相关的知识,希望对你有一定的参考价值。
我想知道如何返回嵌套dicts的键值。 dict dict(案例1)的案例已在别处得到答案,但我无法概括
案例1:dict的词典
dict = {'key1': {'subkey1': value11, 'subkey2': value12, ...}
'key2': {'subkey1': value21, 'subkey2': value22, ...}
...}
为了获得具有最大'subkey1'值的密钥,我会这样做:
max(dict, key=lambda x: dict[x].get('subkey1'))
案例2:
dict = {'key1':
{'subkey1':
{'subsubkey1': value111, 'subsubkey2': value112, ...}}
'key2':
{'subkey2':
{'subsubkey1': value211, 'subsubkey2': value212, ...}}}
...}
所以我的问题是:
- 我们如何概括案例1的公式?如果我想要一个最大'子子键'的'键'?
- 在性能方面,另一种解决方案是否比单线公式更有效?
感谢您的帮助和贡献
答案
这个答案假设您知道嵌套密钥的路径。然后案例2的一个可能的观点是:
((d.get(key)).get(subkey1)).get(subsubkey1)
你想以累积的方式应用函数get
,注意get
可以与运算符[]
交换,所以上面的行也可以这样看:
((d[key])[subkey1])[subsubkey1]
这就是reduce的功能,来自文档:
将两个参数的函数累加到序列项中,从左到右,以便将序列减少为单个值。例如,reduce(lambda x,y:x + y,[1,2,3,4,5])计算(((((1 + 2)+3)+4)+5)。左参数x是累加值,右参数y是序列的更新值。
因此,您可以通过以下方式嵌套调用:
from functools import reduce
d = {'key1': {'subkey1': {'subsubkey1': 1, 'subsubkey2': 2}},
'key2': {'subkey1': {'subsubkey1': 2, 'subsubkey2': 3}}}
def value(first_key, di=None, path=None):
lst = [di, first_key] + path
return reduce(lambda x, y: x[y], lst)
p = ['subkey1', 'subsubkey1']
print(max(d, key=lambda k: value(k, d, p)))
产量
key2
key=
的推广来自value
函数。基本上,函数接收顶级密钥,字典和密钥路径,然后使用reduce以累积方式应用调用。
UPDATE
以更通用的方式,如果每个顶键'sub...subkey'
有不同的['key1', 'key2', ...]
路径,您可以按以下方式使用每个键的路径字典:
d = {'key1': {'subkey1': {'subsubkey1': 1, 'subsubkey2': 2}},
'key2': {'subkey2': {'subsubkey1': 2, 'subsubkey2': 3}}}
paths = {
'key1': ['subkey1', 'subsubkey1'],
'key2': ['subkey2', 'subsubkey1']
}
print(max(d, key=lambda k: value(k, d, paths[k])))
产量
key2
请注意,value
函数保持不变,只有每个键的路径不同。此解决方案还为每个顶部键提供了不同路径长度的附加值。
以上是关于Python - 嵌套字典中的最大值键,泛化的主要内容,如果未能解决你的问题,请参考以下文章