2010-08-04 29 views
5

मैं अक्सर पाम्बेन अभिव्यक्तियों का उपयोग करके पाइथन में करता हूं, और हालांकि यह ठीक काम करता है, मुझे लगता है कि यह बहुत पठनीय नहीं है, और उम्मीद कर रहा था कि एक बेहतर तरीका हो सकता है। यहां मेरे लिए एक सामान्य उपयोग मामला है।पाइथन प्रकार बिना लैम्ब्डा अभिव्यक्ति

मैं जैसे नंबरों की सूची,, x = [12, 101, 4, 56, ...]

मैं सूचकांक की एक अलग सूची है है: y = range(len(x))

मैं x में मूल्यों पर आधारित y क्रमबद्ध करना चाहते हैं, और मैं इस कार्य करें:

y.sort(key=lambda a: x[a]) 

क्या लैम्ब्डा के प्रयोग किए बिना ऐसा करने का कोई अच्छा तरीका है?

+0

कोई विशेष कारण है कि मूल मूल्यों की एक हल कर सूची पर्याप्त नहीं होगा? 'x_sorted = sorted (x)' – MattH

+1

ओपी तत्वों की क्रमबद्ध क्रम में तत्वों की अनुक्रमणिका चाहता है, तत्वों को स्वयं नहीं। – PaulMcG

+1

यह एक शर्म की बात है कि 'लैम्ब्डा' इतना लंबा और बदसूरत कीवर्ड है। यह करने का यह तरीका बहुत अधिक है। – PaulMcG

उत्तर

11

आप सूची x के __getitem__ विधि का उपयोग कर सकते हैं। यह आपके लैम्ब्डा के रूप में ही बर्ताव करता है और क्योंकि यह एक अजगर समारोह के बजाय एक सी समारोह के रूप में कार्यान्वित किया जाता है बहुत तेजी से हो जाएगा:

>>> x = [12, 101, 4, 56] 
>>> y = range(len(x)) 
>>> sorted(y, key=x.__getitem__) 
[2, 0, 3, 1] 
+0

धन्यवाद, मुझे लगता है कि यह सबसे पठनीय समाधान है। –

5

नहीं सुंदर ढंग से, लेकिन:

[a for (v, a) in sorted((x[a], a) for a in y)] 
BTW

, आप सूचकांकों की एक अलग सूची बनाने के बिना यह कर सकते हैं:

2

मुझे यकीन है कि नहीं कर रहा हूँ अगर यह विकल्प की तरह है आप मतलब, लेकिन आप एक def साथ मुख्य कार्य निर्धारित कर सकते हैं:

def sort_key(value): 
    return x[value] 

y.sort(key = sort_key) 

व्यक्तिगत रूप से, मुझे लगता है कि टी वह lambda से भी बदतर है क्योंकि यह क्रमबद्ध मानदंडों को कोड की लाइन से दूर ले जाता है और यह आपके नामस्थान में sort_key फ़ंक्शन को बिना किसी जोड़ता है।

0

अगर मैं एक और समारोह बनाना चाहता था मुझे लगता है, मैं यह कुछ इस तरह (परीक्षण नहीं) कर सकता है:

def sortUsingList(indices, values): 
    return indices[:].sort(key=lambda a: values[a]) 

हालांकि मुझे लगता है कि मैं बजाय लैम्ब्डा उपयोग करने के लिए एक अतिरिक्त समारोह बनाने के लिए होने से बचने के पसंद करते हैं ।

+0

आप थर्म अनुरोध के खिलाफ लैम्ब्डा का उपयोग कर रहे हैं (हालांकि मैं इसे स्वयं उपयोग करूँगा)। –

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