2012-10-25 10 views
19

मैं वस्तुओं की इस सूची में है जो एक एक्स और एक वाई पैरामीटर (और कुछ अन्य सामान) है की एक सूची से 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

वाह! Thanx दोस्तों! वह तेज़ था और मुझे आवश्यक संकेत देता है! – PDXIII

+1

@Wtower संपादन के लिए धन्यवाद। यह अब और अधिक सुगम है! – PDXIII

उत्तर

36

सिर्फ अधिकतम मूल्य प्राप्त करने के लिए और नहीं संपूर्ण वस्तु आप एक जनरेटर अभिव्यक्ति का उपयोग कर सकते हैं:

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

मैं दूसरों की तरह 'key = lambda x: x.y' way चुना होगा। लेकिन ** यह ** वह है जिसे आप वास्तव में * पायथनिक * कह सकते हैं! +1 –

+1

यह वही है जो मैं ढूंढ रहा था। पागल वाक्यविन्यास! मुझें यह पसंद है! – PDXIII

14

एक अंतर्निहित इस मामले के साथ मदद करने के लिए नहीं है।

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) 
+1

मेरे मामले में सबसे ज्यादा पाइथनिक तरीका है जिसे मैं ढूंढ रहा था।लेकिन अन्य उदाहरणों में लैम्ब्डा शैली पर attrgetter() का एक फायदा है? – PDXIII

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

यदि ऑब्जेक्ट की आवश्यकता है तो यह ठीक है। धन्यवाद! – PDXIII

0

y एक चर के रूप में परिभाषित नहीं है; यह व्यक्तिगत GSNode ऑब्जेक्ट्स की विशेषता है; आप इसे अपने नाम पर इस्तेमाल नहीं कर सकते हैं।

व्यक्तिगत विशेषताओं तक पहुंचने के लिए आप या attrgetter() जैसे operator मॉड्यूल से कुछ उपयोग कर सकते हैं।

+0

स्पष्टीकरण के लिए धन्यवाद! यह उज्ज्वल हो रहा है! – PDXIII

2

वहाँ जब बनाम लैम्ब्डा शैली # 2 "pythonic" शैली # 1 का उपयोग करने के लिए एक महत्वपूर्ण अंतर है:

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 
संबंधित मुद्दे