182 votes

Méthode pythonique pour trouver la valeur maximale et son indice dans une liste ?

Si je veux la valeur maximale d'une liste, je peux simplement écrire max(List) mais que faire si j'ai également besoin de l'indice de la valeur maximale ?

Je peux écrire quelque chose comme ça :

maximum=0
for i,value in enumerate(List):
    if value>maximum:
        maximum=value
        index=i

Mais ça me semble fastidieux.

Et si j'écris :

List.index(max(List))

Ensuite, la liste sera itérée deux fois.

Y a-t-il un meilleur moyen ?

0 votes

Que voulez-vous dire par "il passera la liste deux fois" ? List.index(max(List)) fonctionne pour moi.

14 votes

@mwc : Il va itérer la liste une fois pour déterminer la valeur maximale, puis l'itérer une seconde fois pour trouver l'indice de cette valeur.

10 votes

Est-ce que list.index() ne serait pas problématique s'il y a des valeurs max dupliquées ?

10voto

Luis Sobrecueva Points 275
max([(v,i) for i,v in enumerate(my_list)])

4voto

Taohidul Islam Points 3035
max([(value,index) for index,value in enumerate(your_list)]) #if maximum value is present more than once in your list then this will return index of the last occurrence

Si la valeur maximale est présente plus d'une fois et que vous voulez obtenir tous les indices,

max_value = max(your_list)
maxIndexList = [index for index,value in enumerate(your_list) if value==max(your_list)]

2voto

Mattias Points 21

Peut-être avez-vous besoin d'une liste triée de toute façon ?

Essayez ça :

your_list = [13, 352, 2553, 0.5, 89, 0.4]
sorted_list = sorted(your_list)
index_of_higher_value = your_list.index(sorted_list[-1])

0voto

AndrewGraham Points 310

J'ai fait quelques grandes listes. L'une est une liste et l'autre est un tableau numpy.

import numpy as np
import random
arrayv=np.random.randint(0,10,(100000000,1))
listv=[]
for i in range(0,100000000):
    listv.append(random.randint(0,9))

En utilisant la fonction %%time de jupyter notebook, je peux comparer la vitesse de différentes choses.

2 secondes :

%%time
listv.index(max(listv))

54,6 secondes :

%%time
listv.index(max(arrayv))

6,71 secondes :

%%time
np.argmax(listv)

103 ms :

%%time
np.argmax(arrayv)

les tableaux de numpy sont follement rapides.

0voto

Eliot Behr Points 31

Méthode de compréhension de la liste :

Disons que vous avez une liste List = [5,2,3,8]

Entonces [i for i in range(len(List)) if List[i] == max(List)] serait une méthode de compréhension de liste pythonique pour trouver les valeurs "i" où List[i] == max(List) .

Il est facilement extensible pour les tableaux qui sont des listes de listes, simplement en faisant une boucle for.

Par exemple, avec une liste arbitraire de listes "array" et en mettant en majuscule "index" comme une liste vide.

array = [[5, 0, 1, 1], 
[1, 0, 1, 5], 
[0, 1, 6, 0], 
[0, 4, 3, 0], 
[5, 2, 0, 0], 
[5, 0, 1, 1], 
[0, 6, 0, 1], 
[0, 1, 0, 6]]
index = []

for List in array:
    index.append([i for i in range(len(List)) if List[i] == max(List)])
index

Sortie : [[0], [3], [2], [1], [0], [0], [1], [3]]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X