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

时间:2018-08-31 19:20:00

标签: python dictionary nested key max

我想知道我们如何返回嵌套字典的键值。 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, ...}}}
        ...}

所以我的问题是:

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

感谢您的帮助和贡献

1 个答案:

答案 0 :(得分: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会以累积方式应用调用。

更新

以更一般的方式,如果每个顶部键'sub...subkey'的{​​{1}}路径不同,则可以通过以下方式为每个键使用路径字典:

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