有更好的方法吗?我不需要对列表进行排序,只需扫描即可获得具有最大指定属性的项目。我最关心的是可读性,但是对整个列表进行排序以获得一个项目似乎有点浪费。
>>> import operator
>>>
>>> a_list = [('Tom', 23), ('Dick', 45), ('Harry', 33)]
>>> sorted(a_list, key=operator.itemgetter(1), reverse=True)[0]
('Dick', 45)
我可以非常详细地做到......
>>> age = 0
>>> oldest = None
>>> for person in a_list:
... if person[1] > age:
... age = person[1]
... oldest = person
...
>>> oldest
('Dick', 45)
答案 0 :(得分:49)
max(a_list, key=operator.itemgetter(1))
答案 1 :(得分:7)
您可以使用max
功能。
模块__builtin __中的内置函数max的帮助:
MAX(...)
max(iterable [,key = func]) - >值
max(a,b,c,... [,key = func]) - >值
使用单个可迭代参数,返回其最大项。 如果有两个或多个参数,则返回最大的参数。
max_item = max(a_list, key=operator.itemgetter(1))
答案 2 :(得分:5)
键也可以是lambda,例如:
people = [("Tom", 33), ("Dick", 55), ("Harry", 44)]
oldest = max(people, key=lambda p: p[1])
出于某种原因,与itemgetter
相比,使用lambda会让人觉得“我的代码”更像是在做这项工作。我认为当你有一组对象时,这感觉特别好:
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)
答案 3 :(得分:2)
使用max()
功能或执行FP样式:
reduce(lambda max, c: max if c <= max else c, [1, 6, 9, 2, 4, 0, 8, 1, 3])
答案 4 :(得分:0)
有些人提到了以下解决方案:
max(nameOfList, key=len)
但是,此解决方案仅返回最大大小的第一个顺序元素。因此,例如,在列表[&#34; ABC&#34;,&#34; DCE&#34;]的情况下,只返回列表的第一项。
为了解决这个问题,我找到了使用过滤功能的以下解决方法:
filter((lambda x: len(x)==len(max(nameOfList, key=len))),nameOfList)