2012-10-25 108 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> 
) 

我需要這個列表的最大值y。不過,我想這:

print max(path.nodes, key=y) 

而且我得到這個錯誤:

NameError: name 'y' is not defined 

我還挺新的Python和doc給我毫無頭緒。我認爲我做錯了關鍵字,因爲如果迭代通過像這樣的節點:

for node in path.nodes: 
    print node.y 

我會得到y的值。 有人可以給我一個解釋嗎?

+0

哇! Thanx人!這很快,給我我需要的線索! – PDXIII

+1

@Tower感謝您的編輯。現在它更清晰可辨! – 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) 

編輯:但是馬克Byers公司的回答是最Python化。

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

在我的情況下,最pythonic的方式是我正在尋找。但在其他例子中,attrgetter()在lambda風格上有什麼優勢? – PDXIII

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

這很好,如果我需要的對象。謝謝! – PDXIII

0

y沒有被定義爲一個變量;它是個體的一個屬性; GSNode對象;你不能單獨使用它作爲名稱。

要訪問個人屬性,您可以使用operator模塊中的key=lambda x: x.yattrgetter()之類的內容。

+0

謝謝你的解釋!它變得更加明亮! – PDXIII

2

有關於何時使用「Python化」風格#1與拉姆達風格#2一個重要的區別:如果你仔細看,你可以看到,風格

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

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

#1返回屬性「y」的最大值,而樣式#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 
相關問題