2015-02-07 14 views
9

यहां मेरी समस्या का एक सरल उदाहरण है। मैंने सोचा था कि इन कार्यों बिल्कुल वैसा ही व्यवहार होगा:अजीब व्यवहार: कार्यों के लिए टर्नरी ऑपरेटर

def f1(l): 
    if type(l[0][0])==list: f=lambda x:x[0][0] 
    else: f=lambda x:x[0] 
    l.sort(key=f,reverse=True) 

def f2(l): 
    f=lambda x:x[0][0] if type(l[0][0])==list else lambda x:x[0] 
    l.sort(key=f,reverse=True) 

l=[[1,2],[3,4]] 

लेकिन वास्तविकता f1(l) ठीक काम करता है जब f2(l) अपवाद के साथ गिर में:

IndexError: list index out of range 

तो सवाल यह है कि क्यों यह इतना है और यह है टर्नरी ऑपरेटर का उपयोग करना संभव है जो कि कार्यों में से एक को वापस देता है?

+1

यह टेंगेंशियल की तरह है, लेकिन हो सकता है कि यह उन परिस्थितियों में से एक है जहां एक भेड़ का बच्चा चीजों को और अधिक पढ़ने के लिए आसान बनाता है। 'Def getKey (x) के बारे में कैसे: 'जो' x' की जांच करता है और 'x [0]' या 'x [0] [0]' या जो कुछ भी आपको चाहिए? फिर 'l.sort (key = getKey, reverse = true)'। –

+0

@ आसाद हाँ, यह एक अच्छा मुद्दा है, हालांकि यह मूल संस्करण की तुलना में थोड़ा धीमा काम कर सकता है। – Nik

+0

मुझे यकीन नहीं है कि मैं देखता हूं कि यह धीमा क्यों होगा। जब भी आप 'एफ 1' या' एफ 2 'कहते हैं, तो यह एक फ़ंक्शन बनाने के ऊपरी हिस्से से बचाता है, इसलिए अगर कुछ भी (महत्वहीन) अधिक प्रदर्शनकारी होगा। मैं नहीं कहूंगा कि अंतर किसी भी तरह से चिंता करने लायक है। –

उत्तर

8

lambda में lowest precedence among operators है।

f = (lambda x: x[0][0]) if type(l[0][0]) == list else (lambda x: x[0]) 

जिसके अनुसार, type(l[0][0]) == list थोड़े गलत है, isinstance(l[0][0], list) सबसे अच्छा तरीका है यह भी (: यही कारण है कि अजगर ठीक कोष्ठक में अलग-अलग lambda रों रैप करने के लिए है के रूप में

f = lambda x: (x[0][0] if type(l[0][0]) == list else lambda x: x[0]) 

कि लाइन को पार्स करता है list के उप-वर्गों को संभालता है)।

संबंधित मुद्दे