2010-02-11 11 views
15

में किसी सूची के बड़े तत्वों को कुशलता से प्राप्त करने के लिए कैसे करें इस समस्या को हल करने का सबसे कुशल, सुरुचिपूर्ण और पायथन तरीका क्या है?पाइथन

एन तत्वों की एक सूची (या सेट या जो भी) को देखते हुए, हम सबसे बड़े लोगों को प्राप्त करना चाहते हैं। (आप व्यापकता की हानि के बिना k<n/2 मान सकते हैं, मुझे लगता है) उदाहरण के लिए, यदि सूची थे:

l = [9,1,6,4,2,8,3,7,5] 

एन = 9, और मान लें कि k = 3. क्या 3 पुन: प्राप्त करने के लिए सबसे कारगर एल्गोरिथ्म है सबसे बड़ा? इस मामले में हमें किसी विशेष क्रम में [9,8,7] प्राप्त करना चाहिए।

धन्यवाद! मैनुअल

+0

+ 1 अब जब कि मूल उद्देश्य सेवा की है वहाँ जाने होना CODE- गोल्फ़? –

उत्तर

33

heapq मॉड्यूल से nlargest उपयोग

from heapq import nlargest 
lst = [9,1,6,4,2,8,3,7,5] 
nlargest(3, lst) # Gives [9,8,7] 

तुम भी मामले में nlargest के लिए एक महत्वपूर्ण दे सकते हैं आप अपने मापदंड बदलने चाहता हूँ:

from heapq import nlargest 
tags = [ ("python", 30), ("ruby", 25), ("c++", 50), ("lisp", 20) ] 
nlargest(2, tags, key=lambda e:e[1]) # Gives [ ("c++", 50), ("python", 30) ] 
+0

+1: मुझे इस मॉड्यूल के बारे में पता नहीं था ... धन्यवाद – mshsayem

+0

ग्रेट भाषा रैंकिंग :)) –

7
l = [9,1,6,4,2,8,3,7,5] 

sorted(l)[-k:] 
+0

यह मेरी तुलना में अच्छा है) – Rorick

+0

... लेकिन यह k == 0 के बहुत विशिष्ट मामले में काम नहीं करता है। :) – EOL

4

आप heapq मॉड्यूल का उपयोग कर सकते हैं ।

>>> from heapq import heapify, nlargest 
>>> l = [9,1,6,4,2,8,3,7,5] 
>>> heapify(l) 
>>> nlargest(3, l) 
[9, 8, 7] 
>>> 
+2

हमें इसे यहां अपनाने की आवश्यकता नहीं है – garg10may

7

सरल, O (n लॉग ऑन एन) जिस तरह से सूची को सॉर्ट तो पिछले कश्मीर तत्वों प्राप्त करने के लिए है।

selection algorithm का उपयोग करने का उचित तरीका है, जो ओ (एन + के लॉग के) समय में चलता है।

इसके अलावा, heapq.nlargesttakes O(n log k) time, जो पर्याप्त हो सकता है या नहीं भी हो सकता है।

(यदि के = ओ (एन), तो सभी 3 एल्गोरिदम में एक ही जटिलता होती है (यानी परेशान न करें)। यदि के = ओ (लॉग एन), तो विकिपीडिया में वर्णित चयन एल्गोरिदम ओ (एन) और heapq.nlargest हे है (एन लॉग इन करें n लॉग इन करें), लेकिन डबल लघुगणक के लिए सबसे अधिक व्यावहारिक n "पर्याप्त निरंतर" है कि यह कोई फर्क नहीं पड़ता है।)