2015-10-21 37 views
5

Więc mam listę, która zawiera wiele wykaz których wszystkie trzy struny, potem jeden numer float, jak:Uzyskaj maksymalną wartość z listy z listami?

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

Jak zrobić funkcję, która zwraca wartość maksymalną (co tutaj będzie 9.1931) ? Spróbowałem:

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

ale to po prostu daje mi listę.

EDYCJA: Ponadto, w jaki sposób mogę uzyskać indeks dla skąd pochodzi wartość? Jak, z której sublisty?

+0

Masz dodatkowy otwór kwadratowy uchwyt na drugim indeksie. – bourbaki4481472

+0

@ 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

Odpowiedz

4

Loop poprzez listy zewnętrznej i wybierz ostatni element każdego podmenu:

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

print max_value(resultlist) 
# 9.1931 

To także najlepiej jeśli zachować wszystkie zmienne funkcji związanych z in-scope (przesuń listę jako argument i Don nie mylić przestrzeni nazw poprzez ponowne użycie nazw zmiennych).

0

Czy próbujesz po prostu uzyskać maksymalną liczbę z pływaków (ostatni indeks na twojej liście)? Jeśli tak, oto rozwiązanie.

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

Dlaczego używać 'sorted() [0]' zamiast 'max()'? To ogromny hit, by posortować listę tylko po to, by uzyskać największą wartość. – wflynny

+0

@wflynny Edytowałem swoją odpowiedź, ponieważ opublikowałeś swój komentarz, 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))) 

wyjściowa:

9.1931 
+0

Myślę, że nie potrzebujesz dodatkowego polecenia listy. – Cleb

+0

@Cleb, tak dobrze, dobrze wiedzieć .... – LetzerWille

7

być może w bardziej funkcjonalny niż pythonowy sposób:

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

Zaczyna się przez odwzorowanie każdego elementu listy wynikowej wartości liczby i odnajduje max .

pośredni tablica jest:

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

Jeśli chcesz indeks też można użyć enumerate z operator.itemgetter użyciu map:

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

Który powróci krotka max z indeksu:

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) 

Lub tylko 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 dla "itemgetter". Jednak myślę, że coś jest nie tak z pierwszą definicją funkcji "max_val", przynajmniej otrzymuję SyntaxError - myślę, że coś jest nie tak z parantezami. – Cleb

+0

@Cleb, tak okrzyki, miałem jeszcze jedną parenkę –

+0

Czy możesz ją usunąć - nie mam dość reputacji, aby ją edytować !? ;) – Cleb

1

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)