繁体   English   中英

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

[英]Python - Key of max value in nested dict, generalization

我想知道我们如何返回嵌套字典的键值。 dict的dict(案例1)的案例已经在其他地方得到解答,但我无法一概而论

案例1:dict的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, ...}}}
        ...}

所以我的问题是:

  • 我们如何概括case1的公式? 我是否需要最大“子子键”的“键”?
  • 在性能方面,另一种解决方案是否会比1行公式更有效?

感谢您的帮助和贡献

该答案假设您知道嵌套键的路径。 那么,情况2的一种可能的观点是:

((d.get(key)).get(subkey1)).get(subsubkey1)

您要以累积的方式应用函数get ,请注意, get可以与operator []交换,因此上面的行也可以这样看:

((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

以更一般的方式,如果每个顶部键['key1', 'key2', ...]'sub...subkey'路径不同,则可以使用字典中的每个键以下方式:

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函数保持相同,只是每个键的路径不同。 此解决方案还为您提供了每个顶部键不同路径长度的附加值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM