我想知道我们如何返回嵌套字典的键值。 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, ...}}}
...}
所以我的问题是:
感谢您的帮助和贡献
答案 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
函数保持不变,只是每个键的路径不同。此外,此解决方案还为您提供了每个顶部键不同路径长度的附加值。