从嵌套字典中获取具有最大值的键

3

非常感谢您的帮助。

我构建了以下代码(我尝试了下面的代码,使用了一个字典内嵌另一个字典)。

import operator
character = {'eyes_color':{"blue":10,"brown":12},
         'hair_color':{"black":15, "blonde":7},
         'gender': {"male":16,"female":6}
         }
maximun_key=max(character.items(), key=operator.itemgetter(1))[0]

正如您所看到的,我在我的代码中使用了:

maximun_key=max(character.items(), key=operator.itemgetter(1))[0]

得到的输出:
brown

male

black

即每个字典的最大值。

我期望得到以下输出:

male

我的意思是具有最大值的

有人知道我如何解决这个问题吗?

4个回答

3

通过内置的功能,简单易懂的方式:

d = {'eyes_color': {"blue": 10, "brown": 12},
     'hair_color': {"black": 15, "blonde": 7},
     'gender': {"male": 16, "female": 6}
     }

max_value, max_key = max(((v,k) for inner_d in d.values() for k,v in inner_d.items()))
print(max_key)   # male
print(max_value) # 16

2
你也可以使用mapfunctools.partial来实现这个功能。最初的回答是正确的。
vmax = partial(max, key=itemgetter(1))
vmax(map(vmax, map(dict.items, character.values())))[0]

这里使用partial函数创建了一个可重复使用的最大值函数,并使用自定义键,然后将dict.items映射到每个子字典,对这些结果进行最大化处理,最终得到最大值。


>>> from operator import itemgetter
>>> from functools import partial
>>> character = {'eyes_color':{"blue":10,"brown":12}, 'hair_color':{"black":15, "blonde":7}, 'gender': {"male":16,"female":6}}
>>> vmax = partial(max, key=itemgetter(1))
>>> max(map(vmax, map(dict.items, character.values())))[0]
male 

2

另一种方式 -

使用 lambda:

character = {'eyes_color':{"blue":10,"brown":12},
         'hair_color':{"black":15, "blonde":7},
         'gender': {"male":16,"female":6}
         }

maximun_key= max([max(chars.items(),key = lambda x: x[1]) for chars in character.values()],key = lambda x: x[1])[0]

OR

Using operator.itemgetter :

from operator import itemgetter
character = {'eyes_color':{"blue":10,"brown":12},
         'hair_color':{"black":15, "blonde":7},
         'gender': {"male":16,"female":6}
         }
maximun_key= max([max(chars.items(),key=itemgetter(1)) for chars in character.values()],key=itemgetter(1))[0]

1
这绝对不是 OP 所要求的,它可能会返回 'male',但这是因为 max('male', 'female') == 'male'。你正在按字典顺序比较每个子字典键。尝试更改值,使 female 成为结果,它仍将显示 'male'。甚至尝试将其中一个 eye_color 键更改为 'zed',输出将是 zed。 - Jab
谢谢,@Jab,你说得对。我的意图是首先从“眼睛颜色”,“头发颜色”和“性别”的每个元素中找到最大的元素。然后再从该列表中找到最大的元素。我已经相应地修改了代码。 - Anupam Bera

1
使用以下代码获取结果:
import numpy as np
key_list, value_list = [], []
character = {'eyes_color':{"blue":10,"brown":12},
     'hair_color':{"black":15, "blonde":7},
     'gender': {"male":16,"female":6}
     }

for var in character.values():
    for i in var :
        key_list.append(i)
        value_list.append(var[i])

max_index = np.argmax(value_list)   #Getting index of maximum value
result = key_list[max_index]  #Getting result with the help of index value.
print(result)

输出

male

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接