首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从对象列表中获取属性的最大值

从对象列表中获取属性的最大值
EN

Stack Overflow用户
提问于 2012-10-25 19:29:55
回答 5查看 55.6K关注 0票数 51

我有这个对象列表,它们有一个x和一个y参数(以及其他一些东西)。

代码语言:javascript
复制
path.nodes = (
    <GSNode x=535.0 y=0.0 GSLINE GSSHARP>,
    <GSNode x=634.0 y=0.0 GSLINE GSSHARP>,
    <GSNode x=377.0 y=706.0 GSLINE GSSHARP>,
    <GSNode x=279.0 y=706.0 GSLINE GSSHARP>,
    <GSNode x=10.0 y=0.0 GSLINE GSSHARP>,
    <GSNode x=110.0 y=0.0 GSLINE GSSHARP>,
    <GSNode x=189.0 y=216.0 GSLINE GSSHARP>,
    <GSNode x=458.0 y=216.0 GSLINE GSSHARP>
)

我需要这个列表中的最大y。尽管如此,我还是尝试了一下:

代码语言:javascript
复制
print(max(path.nodes, key=y))

我得到了这个错误:

代码语言:javascript
复制
NameError: name 'y' is not defined

我是Python的新手,docs没有给我任何提示。我认为我在关键字上做错了,因为如果像这样遍历节点:

代码语言:javascript
复制
for node in path.nodes:
    print(node.y)

我会得到y的值,有人能给我一个解释吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-25 19:32:30

要只获取最大值而不是整个对象,可以使用生成器表达式:

代码语言:javascript
复制
print(max(node.y for node in path.nodes))
票数 90
EN

Stack Overflow用户

发布于 2012-10-25 19:31:20

有一个内置的来帮助解决这个问题。

代码语言:javascript
复制
import operator

print(max(path.nodes, key=operator.attrgetter('y')))

或者:

代码语言:javascript
复制
print(max(path.nodes, key=lambda item: item.y))

编辑:但马克·拜尔斯的回答是最有Pythonic风格的。

代码语言:javascript
复制
print(max(node.y for node in path.nodes))
票数 32
EN

Stack Overflow用户

发布于 2017-10-18 01:46:50

在什么时候使用"Pythonic“风格#1和lambda风格#2有一个重要的区别:

代码语言:javascript
复制
max(node.y for node in path.nodes)  # (style #1)

对比

代码语言:javascript
复制
max(path.nodes, key=lambda item: item.y)  # (style #2)

如果仔细观察,您可以看到style #1返回属性y的最大值,而style #2返回具有最大属性ynode。这两者并不相同,如果您希望迭代属性值或迭代包含该属性的对象,则代码的使用非常重要。

示例:

代码语言:javascript
复制
class node():
    def __init__(self,x):
        self.x = x
        self.y = self.x + 10

node_lst = [node(1), node(2), node(3), node(4), node(5)]
print([(e.x,e.y) for e in node_lst])

>>> [(1, 11), (2, 12), (3, 13), (4, 14), (5, 15)]

现在:

代码语言:javascript
复制
maxy = max(node.y for node in node_lst)
print(maxy)
>>> 15

max_node = max(node_lst, key=lambda node: node.y)
print(max_node.y)
>>> 15
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13067615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档