2015-10-21 7 views
5

Così ho un elenco che contiene molti lista che tutti hanno tre corde, poi un numero float, come:Ottieni il valore massimo da un elenco con elenchi?

resultlist = [["1", "1", "a", 8.3931], ["1", "2", "b", 6.3231], ["2", "1", "c", 9.1931]] 

Come faccio a fare una funzione che restituisce il valore massimo (che qui sarebbe 9,1931) ? Ho provato

def MaxValue(): 
    max_value = max(resultlist) 
    return max_value 

ma che mi dà solo una lista.

EDIT: Inoltre, in qualsiasi modo è possibile ottenere l'indice da cui proviene il valore? Come, da quale sottolista?

+0

Hai un'apertura supplementare parentesi quadra al secondo indice. – bourbaki4481472

+0

@ bourbaki4481472 Oh sì, scusa, non doveva essere lì. È stato solo un errore quando ho scritto la domanda, non è nel mio programma attuale. – FeatherMarauder

risposta

4

Loop attraverso la vostra lista esterno e selezionare l'ultimo elemento di ogni sottoelenco:

def max_value(inputlist): 
    return max([sublist[-1] for sublist in inputlist]) 

print max_value(resultlist) 
# 9.1931 

E 'anche meglio se si mantiene tutte le variabili legate funzione in-scope (passa la lista come argomento e don confondere lo spazio dei nomi riutilizzando i nomi delle variabili).

0

Stai cercando di ottenere il numero massimo dai float (l'ultimo indice nella tua lista)? Se è così, ecco una soluzione.

last_indices = [x[3] for x in resultlist] 
return max(last_indices) 
+0

Perché usare 'sorted() [0]' invece di 'max()'? Questo è un enorme successo in termini di prestazioni per ordinare la lista solo per ottenere il massimo valore. – wflynny

+0

@wflynny Ho modificato la mia risposta perché in realtà hai pubblicato il tuo commento, haha. – bourbaki4481472

2
resultlist = [["1", "1", "a", 8.3931], ["1", "2", "b", 6.3231], ["2", "1", "c", 9.1931]] 
print(max(map(lambda x: x[-1],resultlist))) 

uscita:

9.1931 
+0

Penso che non sia necessario il comando di lista aggiuntiva. – Cleb

+0

@Cleb, si hai ragione, buono a sapersi .... – LetzerWille

7

In forse più funzionale modo pythonic:

>>> max(map(lambda x: x[3], resultlist)) 
9.1931 

Si inizia con la mappatura ciascun elemento della lista risultato al valore numerico e poi trova il max .

L'array intermedio è:

>>> map(lambda x: x[3], resultlist) 
[8.3931000000000004, 6.3231000000000002, 9.1930999999999994] 
2

Se si desidera che l'indice di troppo è possibile utilizzare enumerate con operator.itemgetter utilizzando map:

from operator import itemgetter 
def max_val(l, i): 
    return max(enumerate(map(itemgetter(i), l)),key=itemgetter(1))) 

che restituirà una tupla della massima con l'indice:

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) 

O semplicemente ar egular gen exp:

from operator import itemgetter 
def max_val(l, i): 
    return max(enumerate(sub[i] for sub in l), key=itemgetter(1)) 
+1

+1 per "itemgetter". Comunque, penso che ci sia qualcosa di sbagliato nella prima definizione della funzione "max_val", almeno io ricevo un SyntaxError - Immagino ci sia qualcosa di sbagliato nelle parate. – Cleb

+0

@Cleb, sì grazie, ho avuto un paren in più –

+0

Potresti rimuoverlo - Non ho abbastanza reputazione per modificarlo !? ;) – Cleb

1

Ecco una risposta nel caso in cui si ottiene una lista di lista in cui il numero non è sempre al 3 ° posizione:

from itertools import chain 
max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(resultlist))) 

Che cosa sta succedendo? itertools.chain appiattisce l'elenco degli elenchi, il filter quindi seleziona tutti i valori numerici di cui viene determinato il valore massimo utilizzando la funzione max. Il vantaggio è che funziona anche per liste arbitrarie di liste in cui il valore numerico può essere trovato in qualsiasi punto della lista.

Per esempio:

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 

più Un esempio generale:

myList = [[23, 34, 'a'],['b'],['t', 100]] 
max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(myList))) 
#prints 100 

EDIT:

Se anche voi volete ottenere l'indice del valore massimo, si può fare la seguente (utilizzando l'approccio @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) 

Questo approccio presuppone che esista esattamente un valore numerico per elenco!

Un altro esempio utilizzando una lista in cui il valore numerico è in una posizione arbitraria:

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)