Maximale de Python de sélection dans le cas d'une cravate?
Lors de l'utilisation de la max()
fonction en Python pour trouver la valeur maximale d'une liste (ou tuple, dict etc.) et il y a une cravate pour un maximum de valeur, ce qui n'est Python choisir? Est-il aléatoire?
Cela est pertinent si, par exemple, on a une liste de tuples et on sélectionne un maximum (à l'aide d'un key=
) basé sur le premier élément du tuple, mais il y a des éléments. Comment Python choisir celui qui choisir comme le maximum?
Je travaille en Python v2.6.
Il suffit de ne pas essayer de compter sur cela pour une fonction de tri, s'il vous plaît.
Voir la réponse à la stackoverflow.com/questions/4237914/...
Je suis d'accord avec missingno que ce n'est pas le comportement que vous devez compter sur. J'espère que vous êtes simplement en demandant à des fins de débogage. Si vous vous souciez de le deuxième élément du tuple (dans votre exemple hypothétique) ensuite, vous devez toujours tenir compte dans votre touche= une fonction.
parfois, tout de max va le faire, mais vous voulez toujours une garantie pour la même entrée le même objet sera le max.
Voir la réponse à la stackoverflow.com/questions/4237914/...
Je suis d'accord avec missingno que ce n'est pas le comportement que vous devez compter sur. J'espère que vous êtes simplement en demandant à des fins de débogage. Si vous vous souciez de le deuxième élément du tuple (dans votre exemple hypothétique) ensuite, vous devez toujours tenir compte dans votre touche= une fonction.
parfois, tout de max va le faire, mais vous voulez toujours une garantie pour la même entrée le même objet sera le max.
OriginalL'auteur Double AA | 2011-07-21
Vous devez vous connecter pour publier un commentaire.
Sur Python 2, ce n'est pas spécifiée dans la documentation et n'est pas dans le portable en Python section de la bibliothèque standard, de sorte que ce comportement peut varier entre les implémentations.
Dans la source de Disponible 2.7 ceci est mis en œuvre dans
./Python/bltinmodule.c
parbuiltin_max
[source], qui enveloppe la plus généralemin_max
fonction [source].min_max
va faire une itération sur les valeurs et l'utilisationPyObject_RichCompareBool
[docs] pour voir si elles sont supérieures à la valeur actuelle. Si oui, la plus grande valeur, elle remplace. L'égalité des valeurs sera ignorée.Le résultat est que le premier maximum sera retenue dans le cas d'une cravate.
Ouais, les comparaisons avec les dictionnaires ne suivent pas la même logique, je suis surpris que Python permet d'utiliser les mêmes opérateurs. Il me semble qu'il est juste de demander à créer des bugs...
+1 pour la belle réponse.
OriginalL'auteur Jeremy
De tests empiriques, il apparaît que
max()
etmin()
sur une liste sera de retour le premier de la liste qui correspond à lamax()
/min()
en cas d'égalité:Et Jeremy est un excellent détective confirme que c'est effectivement le cas.
ouais, je ne suis pas sûr, il est logique intuitive, mais je suis encore à essayer de trouver la confirmation dans la source/docs
Selon stackoverflow.com/questions/4237914/..., oui.
Je ne vois pas vraiment faire une déclaration officielle. Et comme d'habitude pour la documentation: sans-papiers, le comportement est, au mieux, la mise en œuvre définies, mais on ne devrait pas s'attendre à la même chose.
Je suppose que la "il suffit de ne pas essayer de compter sur cela pour une fonction de tri, s'il vous plaît." observations sur la question, a rencontré le "CYA" pour nous tous.
OriginalL'auteur Daniel DiPaolo
Pour Python 3, le comportement de
max()
dans le cas de liens n'est plus seulement un détail d'implémentation, comme détaillé dans les autres réponses. La fonctionnalité est désormais garanti, comme le Python 3 docs explicitement état:Merci, bien à vous soulevez un point important, non seulement pour ce cas, mais d'autres Q&Comme aussi!
Est-il un moyen d'obtenir le dernier rencontré, au lieu de la première (sans avoir à recourir à un traitement de tri)?
inverser la liste avant d'appliquer max()
Ou sinon, cela. (légèrement différentes, que l'on obtenir l'index)
OriginalL'auteur Chris_Rands
Votre question un peu conduit à une note. Lors du tri d'une structure de données, il est souvent un désir de maintenir un ordre relatif des objets qui sont considérés comme équivalents à des fins de comparaison. Ce qui allait être connu comme un tri stable.
Si vous avez absolument besoin de cette fonctionnalité, vous pourriez faire un
sort()
, qui sera stable et ensuite avoir connaissance de l'ordre par rapport à la liste initiale.Comme par python lui-même, je ne crois pas que vous obtenez la garantie de l'élément que vous obtenez lorsque vous appelez
max()
. D'autres réponses sont à donner le disponible de réponse, mais d'autres implémentations (IronPython, Jython) pourrait fonctionner différemment.OriginalL'auteur Bill Lynch
Pour Python 2 versions, l'OMI, je crois que vous ne pouvez pas supposer que
max()
renvoie le premier maximale de l'élément dans la liste dans le cas de liens. J'ai cette conviction carmax()
est censé mettre en œuvre la véritable fonction mathématiquemax
, qui est utilisé sur des jeux qui ont un total de la commande, et où les éléments n'ont pas toutes les "informations cachées".(Je vais supposer que d'autres ont fait des recherches correctement, et le Python de la documentation ne donne pas toutes les garanties pour
max()
.)(En général, il y a un nombre infini de questions que vous pouvez poser des questions sur le comportement d'une fonction de la bibliothèque, et presque tous ne peuvent pas être répondues. Pour exemple: Combien d'espace de pile sera
max()
utiliser? Sera-ce l'utilisation de l'ESS? Combien de mémoire temporaire? Peut-il comparer la même paire d'objets, plus d'une fois (si la comparaison a un effet secondaire)? Il peut courir plus vite que O(n) le temps de "spécial" connus des structures de données? etc. etc.)OriginalL'auteur Nayuki