【问题标题】:Python - Key of max value in nested dict, generalizationPython - 嵌套字典中的最大值键,泛化
【发布时间】:2019-02-06 20:19:24
【问题描述】:

我想知道我们如何返回嵌套字典的键值。 dict of 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的公式?如果我想要最大“子子键”的“键”?
  • 就性能而言,另一种解决方案是否比单行公式更有效?

感谢您的帮助和贡献

【问题讨论】:

  • 你期望的结果是什么?
  • 我想要最大 subsubkey1 的“键”。假设 value111=111 等等。在这个例子中,它是 key2
  • 您是否尝试过使用递归从key >> subkey >> subsubkey 到任意长的嵌套结构到sub...subkey?这样你就可以深入到 subdicts 中,然后在最后返回“root”键
  • 是的,关键是尽可能避免递归。但是性能呢?

标签: python dictionary nested key max


【解决方案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 以累积的方式应用调用。

更新

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

【讨论】:

  • 非常感谢您的详细回答,非常感谢。为了使答案完全概括,如果子键不同(如 subkey1 和 subkey2),您认为什么是好的解决方案?
  • @Joseph 如果我的回答有助于解决您的问题,请考虑marking it as accepted。这是表示您的问题已“解决”并感谢帮助您的人的惯用方式。
  • 我不知道我必须将解决方案标记为已接受,我只是投了赞成票。我确实感谢了你两次!这是另一个专为您准备的:谢谢 Daniel Mesejo
猜你喜欢
  • 2020-10-03
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 2018-11-30
相关资源
最近更新 更多