J'ai donc une liste qui contient plusieurs listes qui ont toutes trois chaînes en premier, puis un nombre flottant, comme:
resultlist = [["1", "1", "a", 8.3931], ["1", "2", "b", 6.3231], ["2", "1", "c", 9.1931]]
Comment puis-je créer une fonction qui renvoie la valeur maximale (qui serait ici 9,1931)? j'ai essayé
def MaxValue():
max_value = max(resultlist)
return max_value
mais cela me donne juste une liste.
EDIT: De plus, est-ce que je pourrais obtenir l'index d'où vient la valeur? Comme, de quelle sous-liste?
Parcourez votre liste externe et sélectionnez le dernier élément de chaque sous-liste:
def max_value(inputlist):
return max([sublist[-1] for sublist in inputlist])
print max_value(resultlist)
# 9.1931
Il est également préférable de conserver toutes les variables liées aux fonctions dans le champ d'application (passez la liste en argument et ne confondez pas l'espace de noms en réutilisant les noms de variables).
D'une manière peut-être plus fonctionnelle que Pythonique:
>>> max(map(lambda x: x[3], resultlist))
9.1931
Il commence par mapper chaque élément de la liste de résultats sur la valeur numérique, puis trouve le max.
Le tableau intermédiaire est:
>>> map(lambda x: x[3], resultlist)
[8.3931000000000004, 6.3231000000000002, 9.1930999999999994]
resultlist = [["1", "1", "a", 8.3931], ["1", "2", "b", 6.3231], ["2", "1", "c", 9.1931]]
print(max(map(lambda x: x[-1],resultlist)))
Production:
9.1931
Si vous voulez aussi l'index, vous pouvez utiliser enumerate
avec operator.itemgetter
en utilisant map
:
from operator import itemgetter
def max_val(l, i):
return max(enumerate(map(itemgetter(i), l)),key=itemgetter(1)))
Qui renverra un Tuple du max avec l'index:
In [7]: resultlist = [["1", "1", "a", 8.3931], ["1", "2", "b", 6.3231], ["2", "1", "c", 9.1931]]
In [8]: max_val(resultlist, -1)
Out[8]: (2, 9.1931)
Ou juste une exp gen régulière:
from operator import itemgetter
def max_val(l, i):
return max(enumerate(sub[i] for sub in l), key=itemgetter(1))
Essayez-vous d'obtenir le nombre maximal de flotteurs (le dernier index de votre liste)? Si oui, voici une solution.
last_indices = [x[3] for x in resultlist]
return max(last_indices)
Numpy aide avec les listes imbriquées numériques. Essaye ça:
resultlist = [[3, 2, 4, 4], [1, 6, 7, -6], [5, 4, 3, 2]]
max(resultlist) # yields [5, 4, 3, 2] because 5 is the max in: 3, 1, 5
np.max(resultlist) # yields 7 because it's the absolute max
max()
renvoie la liste dont le premier élément est le maximum du premier élément de toutes les listes, tandis que np.max()
renvoie la valeur la plus élevée de toutes les listes imbriquées.
Voici une réponse au cas où vous obtenez une liste de liste où le numéro n'est pas toujours en 3ème position:
from itertools import chain
max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(resultlist)))
Que se passe-t-il? itertools.chain
aplatit la liste des listes, filter
sélectionne ensuite toutes les valeurs numériques dont la valeur maximale est ensuite déterminée à l'aide de la fonction max
. L'avantage ici est qu'il fonctionne également pour les listes arbitraires de listes où la valeur numérique peut être trouvée n'importe où dans la liste.
Pour votre exemple:
resultlist = [['1', '1', 'a', 8.3931], ['1', '2', 'b', 6.3231], ['2', '1', 'c', 9.1931]]
max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(resultlist)))
#prints 9.1931
Un autre exemple général:
myList = [[23, 34, 'a'],['b'],['t', 100]]
max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(myList)))
#prints 100
ÉDITER:
Si vous souhaitez également obtenir l'index de la valeur maximale, vous pouvez procéder comme suit (en utilisant l'approche @Padraic Cunningham):
from itertools import chain
import operator
resultlist = [['1', '1', 'a', 8.3931], ['1', '2', 'b', 6.3231], ['2', '1', 'c', 9.1931]]
l = filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(resultlist))
# l: [8.3931, 6.3231, 9.1931]
max(enumerate(l), key = operator.itemgetter(1))
#(2, 9.1931)
Cette approche suppose qu'il y a exactement une valeur numérique par liste!
Un autre exemple utilisant une liste où la valeur numérique est sur une position arbitraire:
from itertools import chain
import operator
myList = [[23, '34', 'a'],['b', 1000],['t', 'xyz', 100]]
l=filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(myList))
max(enumerate(l), key = operator.itemgetter(1))
#prints (1, 1000)