J'ai une liste:
a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
L'élément max est de 55 (deux éléments sur les positions 9 et 12)
J'ai besoin de trouver sur quelle (s) position (s) se situe la valeur maximale. S'il vous plaît, aidez.
vous indiquera l'index de la première instance du plus grand élément valorisé de la liste
a
.la source
La réponse choisie (et la plupart des autres) nécessite au moins deux passages dans la liste.
Voici une solution en un seul passage qui pourrait être un meilleur choix pour les listes plus longues.
Édité: Pour remédier aux deux lacunes soulignées par @John Machin. Pour (2), j'ai tenté d'optimiser les tests en fonction de la probabilité estimée d'occurrence de chaque condition et des inférences permises par les prédécesseurs. Il était un peu difficile de déterminer les valeurs d'initialisation appropriées pour
max_val
etmax_indices
qui fonctionnaient dans tous les cas possibles, surtout si le max se trouvait être la première valeur de la liste - mais je pense que c'est le cas maintenant.la source
[]
comme annoncé ("Liste de retour"). Le code doit être simpleif not seq: return []
. (2) Le schéma de test en boucle est sous-optimal: en moyenne dans les listes aléatoires, la conditionval < maxval
sera la plus courante mais le code ci-dessus prend 2 tests au lieu d'un.==
au lieu de 2 - votreelif
condition sera toujours vraie.elif
moi-même, FWIW. ;-)J'ai proposé ce qui suit et cela fonctionne comme vous pouvez le voir
max
,min
et d'autres fonctions sur des listes comme celles-ci:Alors, veuillez considérer la liste d'exemples suivante pour connaître la position du maximum dans la liste
a
:Utilisation du générateur
enumerate
et réalisation d'un castingÀ ce stade, nous pouvons extraire la position de max avec
Ce qui précède nous dit que le maximum est en position 4 et sa valeur est 5.
Comme vous le voyez, dans l'
key
argument, vous pouvez trouver le maximum sur n'importe quel objet itérable en définissant un lambda approprié.J'espère que cela contribue.
PD: Comme @PaulOyster l'a noté dans un commentaire. Avec
Python 3.x
lamin
etmax
permettre à un nouveau mot - clédefault
qui permettent d' éviter l'exception de souleverValueError
lorsque l' argument est une liste vide.max(enumerate(list), key=(lambda x:x[1]), default = -1)
la source
Je ne peux pas reproduire la performance de @ SilentGhost citée par @martineau. Voici mon effort avec des comparaisons:
=== maxelements.py ===
Résultats d'un vieux portable usé exécutant Python 2.7 sur Windows XP SP3:
la source
C'est comme ça que je le fais habituellement.
la source
Vous pouvez également utiliser le package numpy:
Cela renverra un tableau numpy de tous les indices contenant la valeur maximale
si vous souhaitez transformer cela en une liste:
la source
la source
Une solution, qui ne donne que la première apparence , peut également être obtenue en utilisant
numpy
:la source
@shash a répondu à cela ailleurs
Ce qui fait une passe . Pourtant, il est plus lent que la solution de @Silent_Ghost et, plus encore, de @nmichaels:
la source
Voici la valeur maximale et les index auxquels elle apparaît:
Plus tard: pour la satisfaction de @SilentGhost
la source
heapq
- trouver le maximum là-bas serait trivial.heapq
solution, je doute que cela fonctionne.Idée similaire avec une compréhension de liste mais sans énumération
la source
a[i]
appel.Juste une ligne:
la source
Si vous souhaitez obtenir les indices des plus grands
n
nombres dans une liste appeléedata
, vous pouvez utiliser Pandassort_values
:la source
la source
Ce code n'est pas aussi sophistiqué que les réponses publiées précédemment mais il fonctionnera:
ilist dans le code ci-dessus contiendrait toutes les positions du nombre maximum dans la liste.
la source
Vous pouvez le faire de différentes manières.
La vieille méthode conventionnelle est,
Une autre façon sans calculer la longueur de la liste et stocker la valeur maximale dans une variable,
Nous pouvons le faire de manière pythonique et intelligente! Utilisation de la compréhension de liste sur une seule ligne,
Tous mes codes sont en Python 3.
la source