Oto odpowiedź tylko w przypadku uzyskania listy listy, w których liczba nie zawsze znajduje się na 3 pozycji:
from itertools import chain
max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(resultlist)))
Co się dzieje? itertools.chain
spłaszcza listę list, czyli filter
, a następnie wybiera wszystkie wartości liczbowe, których wartość maksymalna jest określana za pomocą funkcji max
. Zaletą jest to, że działa również na dowolne listy list, w których wartość numeryczna znajduje się w dowolnym miejscu na liście.
Dla przykładu:
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
Jednym z bardziej ogólny przykład:
myList = [[23, 34, 'a'],['b'],['t', 100]]
max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(myList)))
#prints 100
EDIT:
Jeśli też chcesz uzyskać indeks maksymalnej wartości, można wykonać śledzenie (za pomocą podejścia @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)
To podejście zakłada, że na liście znajduje się dokładnie jedna wartość numeryczna!
Jeszcze jeden przykład na podstawie listy, gdy wartość numeryczna jest na dowolnej pozycji:
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)
Masz dodatkowy otwór kwadratowy uchwyt na drugim indeksie. – bourbaki4481472
@ bourbaki4481472 O tak, przepraszam, to nie powinno tam być. To był tylko błąd, kiedy napisałem pytanie, nie jest to w moim rzeczywistym programie. – FeatherMarauder