Подтвердить что ты не робот

Pythonic способ получить самый большой элемент в списке

Есть ли лучший способ сделать это? Мне не нужен список, который нужно сортировать, просто просматривая его, чтобы получить элемент с наибольшим указанным атрибутом. Мне больше всего нравится чтение, но сортировка всего списка, чтобы получить один элемент, кажется немного расточительным.

>>> import operator
>>> 
>>> a_list = [('Tom', 23), ('Dick', 45), ('Harry', 33)]
>>> sorted(a_list, key=operator.itemgetter(1), reverse=True)[0]
('Dick', 45)

Я мог бы сделать это довольно verbosely...

>>> age = 0
>>> oldest = None
>>> for person in a_list:
...     if person[1] > age:
...             age = person[1]
...             oldest = person
... 
>>> oldest
('Dick', 45)
4b9b3361

Ответ 1

max(a_list, key=operator.itemgetter(1))

Ответ 2

Вы можете использовать функцию max.

Справка по встроенной функции max в модуле __builtin __:

тах (...)

max (iterable [, key = func]) → значение

max (a, b, c,... [, key = func]) → значение

С помощью единственного итеративного аргумента верните самый большой элемент.   С двумя или более аргументами верните самый большой аргумент.

max_item = max(a_list, key=operator.itemgetter(1))

Ответ 3

Ключ может также быть лямбдой, например:

people = [("Tom", 33), ("Dick", 55), ("Harry", 44)]
oldest = max(people, key=lambda p: p[1])

По какой-то причине использование лямбды заставляет его больше походить на то, что "мой код" выполняет работу по сравнению с itemgetter. Я думаю, что это особенно приятно, когда у вас есть коллекция объектов:

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

people = [Person("Tom", 33), Person("Dick", 55), Person("Harry", 44)]
oldest = max(people, key=lambda p: p.age)

Ответ 4

Используйте max() или создайте стиль FP:

reduce(lambda max, c: max if c <= max else c, [1, 6, 9, 2, 4, 0, 8, 1, 3])

Ответ 5

Некоторые люди упомянули следующее решение:

max(nameOfList, key=len)

Однако это решение возвращает только первый последовательный элемент наибольшего размера. Так, например, в случае списка [ "ABC", "DCE" ] возвращается только первый элемент списка.

Чтобы исправить это, я нашел следующее обходное решение, использующее функцию фильтра:

filter((lambda x: len(x)==len(max(nameOfList, key=len))),nameOfList)