2
votes

Obtenir des clés avec une valeur maximale à partir d'un dictionnaire imbriqué

Merci d'avance pour votre aide.

J'ai construit le code suivant (j'ai essayé ci-dessous, j'ai utilisé un dictionnaire dans un dictionnaire).

brown

male

black

Comme vous peut voir, j'ai utilisé dans mon code:

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

Obtenir comme sortie:

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]

c'est-à-dire le maximum, mais pour chaque dictionnaire .

J'attendais pour ce cas une sortie comme:

homme

Je veux dire les clés avec des valeurs maximales.

Quelqu'un sait-il comment je peux résoudre ce problème?


0 commentaires

4 Réponses :


1
votes

De manière simple avec des fonctionnalités intégrées:

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


0 commentaires

1
votes

Utilisez le code ci-dessous pour obtenir le résultat: -

male

Sortie

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)


0 commentaires

2
votes

Vous pouvez également le faire en utilisant map et functools.partial .

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

Cela utilise partial pour créer une fonction max réutilisable avec une clé personnalisée, puis mappez simplement dict.items à chaque sous-dict, et le max à cela alors juste obtenez le maximum de ces résultats.

vmax = partial(max, key=itemgetter(1))
vmax(map(vmax, map(dict.items, character.values())))[0]


0 commentaires

2
votes

Une autre manière -

Utilisation de lambda:

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]

OU

Utilisation de operator.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 = lambda x: x[1]) for chars in character.values()],key = lambda x: x[1])[0]


2 commentaires

Ce n'est certainement pas ce que l'op demandait, il peut arriver avec un homme, mais c'est parce que max ('male', 'female') == 'male' Vous comparez chaque sous-clé lexicographiquement . Essayez de changer les valeurs pour que le résultat soit féminin et qu'il affiche toujours «masculin». Essayez même de changer l'une des clés eye_color en 'zed' et la sortie sera zed.


Merci, vous avez raison @Jab. Mon intention était d'abord de trouver l'élément maximum de chaque élément de 'eyes_color', 'hair_color', 'gender' . Ensuite, trouvez à nouveau l'élément maximum de cette liste. J'ai modifié le code en conséquence.