我有这个对象列表,它们有一个x和一个y参数(以及其他一些东西)。
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。尽管如此,我还是尝试了一下:
print(max(path.nodes, key=y))
我得到了这个错误:
NameError: name 'y' is not defined
我是Python的新手,docs没有给我任何提示。我认为我在关键字上做错了,因为如果像这样遍历节点:
for node in path.nodes:
print(node.y)
我会得到y的值,有人能给我一个解释吗?
发布于 2012-10-25 19:32:30
要只获取最大值而不是整个对象,可以使用生成器表达式:
print(max(node.y for node in path.nodes))
发布于 2012-10-25 19:31:20
有一个内置的来帮助解决这个问题。
import operator
print(max(path.nodes, key=operator.attrgetter('y')))
或者:
print(max(path.nodes, key=lambda item: item.y))
编辑:但马克·拜尔斯的回答是最有Pythonic风格的。
print(max(node.y for node in path.nodes))
发布于 2017-10-18 01:46:50
在什么时候使用"Pythonic“风格#1和lambda风格#2有一个重要的区别:
max(node.y for node in path.nodes) # (style #1)
对比
max(path.nodes, key=lambda item: item.y) # (style #2)
如果仔细观察,您可以看到style #1返回属性y
的最大值,而style #2返回具有最大属性y
的node
。这两者并不相同,如果您希望迭代属性值或迭代包含该属性的对象,则代码的使用非常重要。
示例:
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)]
现在:
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
https://stackoverflow.com/questions/13067615
复制相似问题