Python - 嵌套字典中的最大值键,泛化

问题描述 投票:0回答:1

我想知道如何返回嵌套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的公式?如果我想要一个最大'子子键'的'键'?
  • 在性能方面,另一种解决方案是否比单线公式更有效?

感谢您的帮助和贡献

python dictionary nested key max
1个回答
0
投票

这个答案假设您知道嵌套密钥的路径。然后案例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函数保持不变,只有每个键的路径不同。此解决方案还为每个顶部键提供了不同路径长度的附加值。

© www.soinside.com 2019 - 2024. All rights reserved.