2012-10-25 14 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 

私のpythonにちょっと新しいですとdocは私の手掛かりを与えません。私はキーワードを間違えていると思います。このようなノードを繰り返し処理すると、yの値が得られるはずです。

for node in path.nodes: 
    print node.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) 

編集:しかし、マーク・バイヤーズの答えが最もPython的です。

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対「Python的」なスタイルの#1を使用する場合の重要な違いがあります:

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

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

あなたは慎重に見ている場合は、そのスタイルを見ることができます#1は属性 "y"の最大値を返しますが、style#2は最大属性 "y"を持つ "node"を返します。これらの2つは同じではなく、属性値を繰り返し処理したり、その属性を保持しているオブジェクトを反復したりする場合は、コードの使用が重要です。

例:今すぐ

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 
関連する問題