2016-07-29 1 views
3

У меня есть многомерный список в формате:Оптимальный способ найти максимум из Подсписка элементов в списке

list = [[1, 2, 3], [2, 4, 2], [0, 1, 1]] 

Как получить максимальное значение третьего значения всех подсписков. В псевдокоде:

max(list[0][2], list[1][2], list[2][2]) 

Я знаю, что это может быть сделано с помощью Перебора списка и извлечение третьего значения в новый список, просто выполняя max(list), но мне интересно, если это может быть сделано с помощью лямбды или понимание списка?

+0

'макс (лис, ключ = лямбда м: м [-1]) или' макс (лис, key = lambda m: m [-1]) [- 1] ' –

+1

@AvinashRaj Первый возвращает список с максимальным значением, а не с максимальным значением. –

+0

ya, Первый возвращает элемент списка с максимальным присутствием на последнем –

ответ

4

Просто используйте max с выражением генератора:

>>> lst = [[1, 2, 3], [2, 4, 2], [0, 1, 1]] 
>>> max(l[2] for l in lst) 
3 

Кроме того, не называйте переменные list, вы затеняете тип.

+0

Почему downvote? Пожалуйста, помогите мне улучшить мой ответ, если будет какая-то ошибка. –

+0

Это должен быть принятый ответ, так как он точно и изящно решает описанную проблему. – jbndlr

4

Используйте zip функцию, чтобы получить список столбцов, то используйте простой индексации для того, чтобы получить ожидаемый столбец:

>>> lst = [[1, 2, 3], [2, 4, 2], [0, 1, 1]] 
>>> 
>>> max(zip(*lst)[-1]) # in python 3.x max(list(zip(*lst))[-1]) 
3 

один другой альтернативный и более вещий подход пропускание key функцию max, чтобы получить max на основе ключевой функции. В этом случае вы можете использовать itemgetter(-1) для того, чтобы получить максимальный элемент на основе предполагаемого индекса тогда, так как функция max() возвращает весь элемент из списка (суб-списка), вы можете получить ожидаемый элемент по индексации:

>>> from operator import itemgetter 
>>> max(lst, key=itemgetter(-1))[-1] 
3 

Или более функциональны:

>>> key_func = itemgetter(-1) 
>>> key_func(max(lst, key=key_func)) 
3 
+2

Обратите внимание, что 'zip (...) [- 1]' будет работать только в Python 2.x, а затем будет немного медленнее, чем другие. –

+0

@tobias_k Да только что исправлено. Спасибо за комментарий! – Kasramvd

1

применение max в списке вернет максимальный список, который не является тем, что вы хотите. Вы можете действительно использовать список понимание для извлечения третьего элемента, а затем применить max на этом понимании:

>>> lst = [[1, 2, 3], [2, 4, 2], [0, 1, 1]] 
>>> max([x[2] for x in lst]) 
3