2015-10-21 8 views
5

Поэтому у меня есть список, содержащий несколько список, который у всех есть три строки, а затем один номер с плавающей точкой, как:Получите максимальное значение из списка со списками?

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

Как сделать функцию, которая возвращает максимальное значение (которое здесь будет 9.1931) ? Я пробовал

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

но это только что дает мне список.

EDIT: Кроме того, каким-либо образом я могу получить индекс для того, откуда взялось это значение? Как, из какого подсписка?

+0

У вас есть дополнительные отверстия квадратные скобки во втором индексе. – bourbaki4481472

+0

@ bourbaki4481472 О да, извините, этого не должно было быть. Это была просто ошибка, когда я написал вопрос, это не в моей реальной программе. – FeatherMarauder

ответ

4

Loop через ваш внешний список и выберите последний элемент каждого подсписка:

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

print max_value(resultlist) 
# 9.1931 

Это также лучше, если вы храните все переменные функции, связанные в области действия (передать список в качестве аргумента и дону 't путать пространство имен путем повторного использования имен переменных).

0

Вы пытаетесь просто получить максимальное число из поплавков (последний индекс в вашем списке)? Если это так, вот решение.

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

Зачем использовать 'sorted() [0]' вместо 'max()'? Это огромный успех, чтобы отсортировать список, чтобы получить самое большое значение. – wflynny

+0

@wflynny Я отредактировал свой ответ, потому что вы действительно отправили свой комментарий, ха-ха. – 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))) 

Выход:

9.1931 
+0

Думаю, вам не нужна дополнительная команда списка. – Cleb

+0

@Cleb, да вы правы, приятно знать .... – LetzerWille

7

В возможно более функциональным, чем Pythonic образом:

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

Она начинается с отображения каждого элемента списка результатов со значением числа, а затем находит максимальную ,

Промежуточный массив:

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

Если вы хотите, чтобы индекс тоже можно использовать enumerate с operator.itemgetter использованием map:

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

который будет возвращать кортеж из макс с индексом:

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) 

или просто ar Регулярный генераторный ехр:

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

+1 для «itemgetter». Однако, я думаю, что что-то не так с первым определением функции «max_val», по крайней мере, я получаю SyntaxError - я думаю, что что-то не так с скобками. – Cleb

+0

@Cleb, да, ура, у меня был дополнительный пар –

+0

Не могли бы вы его удалить - у меня недостаточно репутации, чтобы отредактировать его !? ;) – Cleb

1

Вот ответ только в том случае, вы получите список списка, где число не всегда на 3-е позиции:

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

Что происходит? itertools.chain выравнивает список списков, filter затем выбирает все числовые значения, максимальное значение которых определяется с помощью функции max. Преимущество в том, что оно также работает для произвольных списков списков, где числовое значение может быть найдено в любом месте списка.

Для примера:

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 

Еще один общий пример:

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

EDIT:

Если вы хотите получить индекс максимального значения, вы можете сделать следующий (с использованием подхода @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) 

Этот подход предполагает, что в списке имеется ровно одно числовое значение! более

Одним из примеров использования списка, где числовое значение находится на произвольном положении:

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)