web-dev-qa-db-fra.com

Obtenir la valeur maximale d'une liste avec des listes?

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?

11
FeatherMarauder

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).

8
wflynny

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]
10
Almog
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
3
LetzerWille

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))
3
Padraic Cunningham

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)
1
bourbaki4481472

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.

1
Guillermo Luijk

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)
1
Cleb