获取列表中最大项的Pythonic方法

23 投票
5 回答
19699 浏览
提问于 2025-04-15 16:50

有没有更好的方法来做这个?我其实不需要把列表排序,只是想找出具有特定属性的最大值。对我来说,代码的可读性最重要,但为了找一个项目而把整个列表排序似乎有点浪费。

>>> 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)

5 个回答

5

这里的“key”也可以是一个lambda表达式,比如:

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

出于某种原因,使用lambda表达式会让人觉得“我的代码”在完成工作,这种感觉比用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)
8

你可以使用 max 函数。

关于内置函数 max 的帮助信息:

max(...)

max(可迭代对象[, key=函数]) -> 值

max(a, b, c, ...[, key=函数]) -> 值

如果只给一个可迭代对象,它会返回其中最大的一个。 如果给两个或更多的参数,它会返回最大的那个参数。

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

在编程中,有时候我们需要处理一些数据,比如从一个地方获取信息,然后把它放到另一个地方。这就像把水从一个杯子倒到另一个杯子一样。我们需要确保水不会洒出来,数据也要在转移过程中保持完整。

有些时候,我们会遇到一些错误,比如数据格式不对,或者我们想要的数据没有找到。这就像在找东西时,发现它不在你以为的地方。为了避免这些问题,我们可以使用一些工具和方法来检查数据,确保它们是正确的。

总之,处理数据就像做一个小实验,我们需要小心翼翼,确保每一步都做对,这样才能得到我们想要的结果。

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

撰写回答