Ответ 1
max(a_list, key=operator.itemgetter(1))
Есть ли лучший способ сделать это? Мне не нужен список, который нужно сортировать, просто просматривая его, чтобы получить элемент с наибольшим указанным атрибутом. Мне больше всего нравится чтение, но сортировка всего списка, чтобы получить один элемент, кажется немного расточительным.
>>> 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)
max(a_list, key=operator.itemgetter(1))
Вы можете использовать функцию max
.
Справка по встроенной функции max в модуле __builtin __:
тах (...)
max (iterable [, key = func]) → значение
max (a, b, c,... [, key = func]) → значение
С помощью единственного итеративного аргумента верните самый большой элемент. С двумя или более аргументами верните самый большой аргумент.
max_item = max(a_list, key=operator.itemgetter(1))
Ключ может также быть лямбдой, например:
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)
Используйте max()
или создайте стиль FP:
reduce(lambda max, c: max if c <= max else c, [1, 6, 9, 2, 4, 0, 8, 1, 3])
Некоторые люди упомянули следующее решение:
max(nameOfList, key=len)
Однако это решение возвращает только первый последовательный элемент наибольшего размера. Так, например, в случае списка [ "ABC", "DCE" ] возвращается только первый элемент списка.
Чтобы исправить это, я нашел следующее обходное решение, использующее функцию фильтра:
filter((lambda x: len(x)==len(max(nameOfList, key=len))),nameOfList)