2012-03-18 15 views
5

मैं एक सूची maxValues ​​ बनाना चाहता हूं जिसमें पूर्णांक lst की सूची से शीर्ष 20 मान शामिल हैं।पूर्णांक की सूची से अधिकतम 20 मान फ़िल्टर करें

maxValues = [] 
for i in range(20): 
    maxValues.append(max(lst)) 
    lst.remove(max(lst)) 

वहाँ इस कार्य या यहाँ तक कि निर्मित समारोह को प्राप्त करने के लिए एक अधिक कॉम्पैक्ट कोड है?

+2

यह सिर्फ कॉम्पैक्टनेस नहीं है। आपका कोड (यदि सही किया गया है, तो 'del' कथन गलत है) ओ (एन * के) है, जबकि अन्य विधियां ओ (nlogn) हैं। – agf

+0

@agf, धन्यवाद, सही किया गया। – xralf

उत्तर

12

नहीं है:

maxvalues = heapq.nlargest(20, lst) 

डॉक से:

heapq.nlargest(n, iterable, key=None)

वापसी एक वें से सबसे बड़े तत्वों के साथ सूची ई डेटासेट iterable द्वारा परिभाषित किया गया। key, अगर प्रदान की है, एक तर्क यह है कि iterable में प्रत्येक तत्व से एक तुलना कुंजी को निकालने के लिए प्रयोग किया जाता है के एक समारोह निर्दिष्ट करता है: key=str.lower समतुल्य: sorted(iterable, key=key, reverse=True)[:n]

या उसी तरह से heapq.nsmallest() उपयोग करें यदि आप चाहते हैं सबसे छोटा।

महत्वपूर्ण नोटfrom the doc:

बाद के दो कार्यों [nlargest और nsmallest] n के छोटे मूल्यों के लिए सबसे अच्छा प्रदर्शन करते हैं। बड़े मूल्यों के लिए, sorted() फ़ंक्शन का उपयोग करना अधिक कुशल है। इसके अलावा, जब n==1, अंतर्निहित min() और max() फ़ंक्शंस का उपयोग करना अधिक कुशल है।

+0

धन्यवाद। यह मेरे जवाब से बेहतर है। सूची बहुत लंबी होने की संभावना है क्योंकि पूरी सूची को हल करने की कोई आवश्यकता नहीं है। –

+0

@ रेमी: मैंने उस दस्तावेज़ से एक नोट जोड़ा जो दो समाधानों की तुलना करता है। –

+0

पूर्ण उत्तर के लिए धन्यवाद। – xralf

5
sorted(lst)[-20:] 

सबसे छोटा मैं सोच सकता हूं। तेजी से होने की संभावना भी है।

(संपादित: पहले पाया कोशिश न्यूनतम अधिकतम करने के बजाय) heapq.nlargest()

+0

मैंने दूसरे जवाब को स्वीकार किया क्योंकि यह अधिक पूरा है लेकिन मैंने आपके सरल तेज़ समाधान का उपयोग किया। – xralf

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