Je suis nouveau python et j'essaie de mettre en œuvre du code de manière plus pythonique et plus efficace. Compte tenu d'un dictionnaire avec des touches et des valeurs numériques, quelle est la meilleure façon de trouver la plus grande clé avec une valeur non nulle? P>
merci p>
4 Réponses :
Quelque chose comme ça devrait être raisonnablement rapide: (suppression du ! = 0 code> sera légèrement plus rapide, mais obscurcit le sens quelque peu.) p> p>
Depuis que l'OP est nouveau, une description de ce qui se passe peut également être utile.
Notez que dans Python 3.x .iteritems code> n'existe plus et .items code> renvoie un itérateur. (Contrairement à Python 2.x, où .items code> renvoie une liste et .iteritems code> renvoie un itérateur.)
Que se passe-t-il ici? Nous appelons max () pour trouver la plus grande clé. Ce que nous passons à max () est une "expression génératrice", très similaire à une "compréhension de la liste". Max () aura une valeur à plusieurs reprises pour K et choisira la plus grande. L'expression génératrice ne retournera que k valeurs lorsque la valeur V n'est pas nulle. Les valeurs K et V proviennent de x.iteritems (), qui renvoie la clé, des paires de valeur. Ce code fonctionnera à Python 2.4 et plus récent, mais comme Stephan202 noté, pour Python 3.x, vous devez remplacer "iteritems" avec des "articles".
La bonne chose à propos des expressions génératrices (et des itérateurs) est qu'elles donnent des valeurs une à la fois, plutôt que de construire un élément de liste volumineux qui sera ensuite détruit immédiatement. Ce serait également correct, mais quelque peu inutile, de construire une liste des tunes de la valeur, de la valeur, puis de calculer le maximum () à partir de cela.
La fonction max de Python prend une clé Utilisation d'une lambda en ligne sur le même effet et la même liaison de variables locales : p> dernière variante à lier dans le VaR local dans la fonction de clé anonyme p> = code> paramètre pour une fonction "Mesure".
Cette fonction dépend de l'accès au global. Mauvaise idée.
Non ça ne le fait pas. Cela ne dépend que d'avoir accès à la même portée. Tout cela peut être à l'intérieur d'une portée de la fonction et cela fonctionnerait toujours.
@dalke, le point reste que la fonction devrait prendre le dictionnaire sous forme d'argument, plutôt que de coder le nom de la dicte.
@steveha: Il existe d'autres raisons de ne pas utiliser cette solution. Pour un, il ne traite pas {0: 0, -1: -1} car il n'est pas réellement ignorer les valeurs zéro. Mais dire que cela "dépend de l'accès au global" n'est pas l'un d'entre eux.
Pour obtenir la plus grande clé, vous pouvez utiliser le Pour filtrer ceux où la valeur est 0, vous pouvez utiliser un expression générateur em> : p> Vous pouvez les combiner pour obtenir ce que vous recherchez (car max Code> Fonction et inspectez les touches telles que ceci: max code> ne prend qu'un argument, les parenthèses autour de l'expression génératrice peuvent être supprimées): p>
Presque là! Enfin, vous retirez les accolades carrées et vous êtes laissé avec la meilleure solution. Les bretelles carrées font une compréhension de la liste, qui construit toute la liste, puis la liste complète est transmise à max (). En laissant des accolades carrées, vous obtenez une expression de générateur qui passe des valeurs une à la fois maximum (). Pour un petit nombre d'articles, ce n'est pas grave, mais pour de très grands dictionnaires, les efforts supplémentaires pour créer une liste, puis la détruire, il peut être considérable.
Je viens de mettre à jour ma réponse ... commutée de listes aux générateurs / itérateurs
Juste FYI, vous n'avez pas besoin des parens supplémentaires. Les parens de max () peuvent faire la double durable: ils peuvent être les parens de l'appel de fonction à max () et peuvent également être les parens autour de l'expression génératrice. Essayez! :-)
Si j'étais que vous et la rapidité, c'était une grosse préoccupation, je créerais probablement une nouvelle classe de conteneurs "Dictmax" qui tiendrait une trace de ses plus grands éléments de valeur non nulle en ayant une pile interne d'index, où le sommet L'élément de la pile est toujours la clé du plus grand élément du dictionnaire. De cette façon, vous obtiendrez le plus grand élément de temps constant à chaque fois. P>
Peut-être devriez-vous utiliser une structure de données plus appropriée, telle qu'un tas, pour récupérer des valeurs min / max dans une collection.
"Plus pythonique" que quoi? Quelle est votre solution actuelle? Qu'est-ce que tu n'aimes pas à ce sujet?