2012-10-25 3 views
19

x 및 y 매개 변수 (및 다른 것들)가있는이 객체 목록이 있습니다.Python : 객체 목록에서 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> 
) 

이 목록의 최대 개수가 필요합니다. 비록,이 시도 :

print max(path.nodes, key=y) 

을 그리고 난이 오류 :

NameError: name 'y' is not defined 

내가 파이썬에 좀 새로운 오전과 doc 내 단서를 제공하지 않습니다. 이 노드를 반복 할 경우 다음과 같이 키워드를 잘못 생각한다고 생각합니다.

for node in path.nodes: 
    print node.y 

y 값을 얻을 수 있습니다. 누군가 내게 설명을 해줄 수 있습니까?

+0

와우! 고맙습니다! 그게 빠르며 내가 필요한 단서를주었습니다! – PDXIII

+1

@Wtower 편집 해 주셔서 감사합니다. 지금은 훨씬 더 읽기 쉽습니다! – PDXIII

답변

36

는 최대 값을 얻으려면 아닌 전체 개체 당신은 발전기의 발현 사용할 수 있습니다

print max(node.y for node in path.nodes) 
+2

다른 것들과 마찬가지로'key = lambda x : x.y' 방식을 선택했을 것입니다. 하지만 ** **이 ** 당신이 정말로 전화 할 수있는 * pythonic *! +1 –

+1

이것은 내가 찾고있는 것입니다. 미친 구문! 나는 그것을 좋아한다! – PDXIII

14

이 경우에 도움이되는 기본 제공 기능이 있습니다. 또한

import operator 

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

:

print max(path.nodes, key=lambda item: item.y) 

편집 : 그러나 마크 바이어스 '대답은 대부분의 파이썬입니다.

print max(node.y for node in path.nodes) 
+1

제 경우에는 가장 비옥 한 방법은 제가 찾고 있던 것입니다.그러나 다른 예제에서는 람다 스타일에 비해 attrgetter()의 장점이 있습니까? – PDXIII

1
from operator import attrgetter 
print max(path.nodes, key=attrgetter("y")) 
+1

개체가 필요하면 괜찮습니다. 고맙습니다! – PDXIII

0

y이 변수로 정의되지 않습니다; 개별 개체의 특성입니다. GSNode; 당신은 그것 자체로 이름으로 그것을 사용할 수 없다.

개별 속성에 액세스하려면 operator 모듈에서 key=lambda x: x.y 또는 attrgetter()과 같은 것을 사용할 수 있습니다.

+0

설명 해 주셔서 감사합니다! 점점 더 밝아졌습니다! – PDXIII

2

람다 스타일 # 2 대 "파이썬"스타일 # 1을 사용하는 경우에 중요한 차이가있다 : 당신이주의 깊게 당신이 스타일을 볼 수 있습니다 보면

max(node.y for node in path.nodes) (style #1) 

max(path.nodes, key=lambda item: item.y) (style #2) 

대이 # 1은 속성 "y"의 최대 값을 반환하지만 style # 2는 최대 속성 "y"를 갖는 "노드"를 반환합니다. 이 둘은 동일하지 않으며 속성 값을 반복하거나 해당 속성을 보유하는 객체를 반복하려는 경우 코드 사용이 중요합니다.

예 : 이제

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