j'ai un dictionary
: les clés sont des chaînes, les valeurs sont des entiers.
Exemple:
stats = {'a':1000, 'b':3000, 'c': 100}
J'aimerais obtenir 'b'
une réponse, car c'est la clé avec une valeur plus élevée.
J'ai fait ce qui suit, en utilisant une liste intermédiaire avec des tuples de valeur-clé inversés:
inverse = [(value, key) for key, value in stats.items()]
print max(inverse)[1]
Est-ce la meilleure approche (ou même plus élégante)?
python
dictionary
max
ricafeal
la source
la source
max(stats)
?max(stats)
utilisera les étiquettes comme clés (il renverra'c'
, étant donné que c'est l'étiquette maximale),max(stats, key=lambda key: stats[key])
est ce qu'OP était après (qui renverra'b'
, étiquette de la valeur indexée maximale). Est-ce plus clair?Réponses:
Vous pouvez utiliser
operator.itemgetter
pour cela:Et au lieu de construire une nouvelle liste dans l'utilisation de la mémoire
stats.iteritems()
. Lekey
paramètre de lamax()
fonction est une fonction qui calcule une clé utilisée pour déterminer comment classer les éléments.Veuillez noter que si vous deviez avoir une autre paire clé-valeur 'd': 3000, cette méthode ne retournera que l' une des deux même si elles ont toutes les deux la valeur maximale.
Si vous utilisez Python3:
la source
max(stats.iterkeys(), key=(lambda key: stats[key]))
key=lambda x: x[1]
?max(stats, key=lambda key: stats[key])
la source
stats[max(stats, key=stats.get)]
max_value = max(stats.values()); {key for key, value in stats.items() if value == max_value}
J'ai testé de nombreuses variantes, et c'est le moyen le plus rapide de renvoyer la clé de dict avec la valeur maximale:
Pour vous donner une idée, voici quelques méthodes candidates:
Le dictionnaire de test:
Et les résultats des tests sous Python 3.2:
Et sous Python 2.7:
Vous pouvez voir que
f1
c'est le plus rapide sous Python 3.2 et 2.7 (ou, plus complètement,keywithmaxval
en haut de cet article)la source
f7
est commef1
ne pas donner de nom à un objet intermédiaire.f7
devrait être (très légèrement) plus rapide quef1
, pas beaucoup plus lent. Et c'est ce que je reçois:>>> timeit.timeit("f1()","from __main__ import f1, f7, d1", number=10000) 0.26785888786807277 >>> timeit.timeit("f7()","from __main__ import f1, f7, d1", number=10000) 0.26770628307832567
Si vous avez besoin de connaître uniquement une clé avec la valeur maximale, vous pouvez le faire sans
iterkeys
ouiteritems
parce que l'itération via le dictionnaire en Python est l'itération via ses clés.ÉDITER:
À partir des commentaires, @ user1274878:
Oui...
max
L'
key
argument facultatif décrit comment comparer les éléments pour obtenir un maximum parmi eux:Les valeurs retournées seront comparées.
Dict
Python dict est une table de hachage. Une clé de dict est le hachage d'un objet déclaré comme clé. Pour des raisons de performances, l'itération passe par un dict implémenté comme itération via ses clés.
Par conséquent, nous pouvons l'utiliser pour supprimer l'opération d'obtention d'une liste de clés.
Fermeture
La
stats
variable disponible via l'__closure__
attribut de lalambda
fonction en tant que pointeur sur la valeur de la variable définie dans la portée parent.la source
Exemple:
si vous voulez trouver la valeur maximale avec sa clé, peut-être que le suivi pourrait être simple, sans aucune fonction pertinente.
la sortie est la clé qui a la valeur max.
la source
En voici un autre:
La fonction
key
renvoie simplement la valeur qui doit être utilisée pour le classement etmax()
renvoie immédiatement l'élément demandé.la source
max(stats, key=lambda k: stats[k])
Si vous ne vous souciez pas de la valeur (je serais surpris, mais) vous pouvez le faire:
J'aime mieux déballer le tuple qu'un indice [0] à la fin de l'expression. Je n'aime jamais beaucoup la lisibilité des expressions lambda, mais je trouve celle-ci meilleure que celle de operator.itemgetter (1) à mon humble avis.
la source
_
pourrait être utilisé à la place deignored
.ignored
air plutôt moche, mais certaines personnes sont contre l'utilisation_
pour plusieurs raisons. Je pense que le premier extrait estÉtant donné que plusieurs entrées peuvent avoir la valeur maximale. Je ferais une liste des clés qui ont la valeur maximale comme valeur.
Cela vous donnera également «b» et toute autre clé max.
Remarque: Pour python 3, utilisez
stats.items()
au lieu destats.iteritems()
la source
max
était chère (par exemple, un dictionnaire LONG), je recommanderais[key for m in [max(stats.values())] for key,val in stats.iteritems() if val == m]
si vous voulez un one-liner, sinon calculezm = ...
au préalable.Vous pouvez utiliser:
Pour renvoyer la clé, utilisez une paire de valeurs:
la source
Pour obtenir la clé / valeur maximale du dictionnaire
stats
:>>> max(stats.items(), key = lambda x: x[0]) ('c', 100)
>>> max(stats.items(), key = lambda x: x[1]) ('b', 3000)
Bien sûr, si vous souhaitez obtenir uniquement la clé ou la valeur du résultat, vous pouvez utiliser l'indexation de tuple. Par exemple, pour obtenir la clé correspondant à la valeur maximale:
>>> max(stats.items(), key = lambda x: x[1])[0] 'b'
Explication
La méthode de dictionnaire
items()
en Python 3 renvoie un objet de vue du dictionnaire. Lorsque cet objet de vue est itéré sur, par lamax
fonction, il renvoie les éléments du dictionnaire sous forme de tuples du formulaire(key, value)
.>>> list(stats.items()) [('c', 100), ('b', 3000), ('a', 1000)]
Lorsque vous utilisez l'
lambda
expressionlambda x: x[1]
, dans chaque itération,x
est l'un de ces tuples(key, value)
. Ainsi, en choisissant le bon index, vous choisissez si vous souhaitez comparer par clés ou par valeurs.Python 2
Pour les versions Python 2.2+, le même code fonctionnera. Cependant, il est préférable d'utiliser la
iteritems()
méthode du dictionnaire au lieu deitems()
pour les performances.Remarques
Cette réponse est basée sur les commentaires sur la réponse de Climbs_lika_Spyder .
Le code utilisé a été testé sur Python 3.5.2 et Python 2.7.10.
la source
la source
Par les solutions itérées via des commentaires dans la réponse sélectionnée ...
En Python 3:
En Python 2:
la source
Je suis arrivé ici à la recherche d'un retour en
mydict.keys()
fonction de la valeur demydict.values()
. Au lieu d'une seule clé retournée, je cherchais à renvoyer le nombre x supérieur de valeurs.Cette solution est plus simple que d'utiliser la
max()
fonction et vous pouvez facilement modifier le nombre de valeurs renvoyées:Si vous voulez la clé de classement la plus élevée, utilisez simplement l'index:
Si vous voulez les deux clés les mieux classées, utilisez simplement le découpage de liste:
la source
max()
. Il est clair que c'est le plus rapide. Je pensais que j'offrirais une solution différente avec l'avantage du tranchage, qui m'était plus utile à l'époqueJe n'ai été satisfait d'aucune de ces réponses.
max
sélectionne toujours la première clé avec la valeur maximale. Le dictionnaire peut avoir plusieurs clés avec cette valeur.Publier cette réponse au cas où cela aiderait quelqu'un. Voir l'article SO ci-dessous
Quel maximum Python choisit-il en cas d'égalité?
la source
Avec
collections.Counter
vous pourriez faireLe cas échéant, vous pouvez simplement commencer par un vide
collections.Counter
et y ajouterla source
Une file d'attente de tas est une solution généralisée qui vous permet d'extraire les n principales clés classées par valeur:
Remarque
dict.__getitem__
est la méthode appelée par le sucre syntaxiquedict[]
. Contrairement àdict.get
, il reviendraKeyError
si aucune clé n'est trouvée, ce qui ne peut pas se produire ici.la source
max((value, key) for key, value in stats.items())[1]
la source
+1 à la solution la plus simple de @Aric Coady .
Et aussi une façon de sélectionner au hasard l'une des clés avec la valeur maximale dans le dictionnaire:
la source
la source
Que diriez-vous:
la source
zip(stats.keys(), stats.values())
est juste un moyen plus long d'écrirestats.items()
. Une fois ce changement effectué, votre réponse sera presque identique à plusieurs réponses plus anciennes.items
n'est pas le même quezip
. Il produit juste le même résultat.J'ai testé la réponse acceptée ET la solution la plus rapide de @ thewolf contre une boucle très basique et la boucle était plus rapide que les deux:
résultats:
la source
Pour les utilisateurs scientifiques de python, voici une solution simple utilisant Pandas:
la source
Dans le cas où vous avez plusieurs clés avec la même valeur, par exemple:
Vous pouvez obtenir une collection avec toutes les clés avec une valeur maximale comme suit:
la source
Approche beaucoup plus simple à comprendre:
Sortie: ['a', 'g']
Maintenant, vous ne pouvez choisir qu'une seule clé:
la source