2012-11-29 13 views
7

क्या पाइथन में कोई पूर्व-निर्मित अनुकूलित टूल/लाइब्रेरी है जो कुछ "कम से कम" मानों के लिए सूचियों को काट/टुकड़ा करने के लिए है?पायथन: क्रमबद्ध सूचियों को काटने/टुकड़े करने का अनुकूलित तरीका

यहाँ मुद्दा है: मान लीजिए मैं की तरह एक सूची है दो:

a=[1,3,5,7,9] 

और मैं सभी नंबरों जो <= 6 हैं हटाना चाहते हैं, तो जिसके परिणामस्वरूप सूची होगा

[7,9] 

6 सूची में नहीं है, इसलिए मैं सूची के अंतर्निहित index(6) विधि का उपयोग नहीं कर सकता। मैं की तरह कर सकते हैं:

#!/usr/bin/env python 
a = [1, 3, 5, 7, 9] 
cut=6 
for i in range(len(a)-1, -2, -1): 
    if a[i] <= cut: 
     break 
b = a[i+1:] 
print "Cut list: %s" % b 

जो काफी त्वरित तरीका होगा अगर सूचकांक से कटौती करने के लिए सूची के अंत के करीब है, लेकिन जो अक्षम हो सकता है अगर आइटम सूची की शुरुआत के करीब है (मान लें, मैं उन सभी आइटमों को हटाना चाहता हूं जो >2 हैं, वहां बहुत सारे पुनरावृत्तियों होंगे)।

मैं बाइनरी खोज या इस तरह का उपयोग करके अपनी खुद की खोज विधि भी कार्यान्वित कर सकता हूं, लेकिन मैं सोच रहा था कि क्या इस प्रकार की चीजों को संभालने के लिए लाइब्रेरी में निर्मित एक विस्तृत ... विस्तृत क्षेत्र है जिसे मैं अन्य मामलों में पुन: उपयोग कर सकता हूं उदाहरण के लिए, अगर मुझे >=6 पर सभी नंबरों को हटाना होगा)।

अग्रिम धन्यवाद।

+0

[bisect] (http: //docs.python) की जांच करें।संगठन/2/पुस्तकालय/bisect.html) मॉड्यूल। – kennytm

उत्तर

5

आप किसी क्रमित खोज करने के लिए bisect module उपयोग कर सकते हैं:

>>> import bisect 
>>> a[bisect.bisect_left(a, 6):] 
[7, 9] 
+0

कामकाजी उदाहरण कोड के लिए धन्यवाद। –

5

bisect.bisect_left जो आप खोज रहे हैं, मुझे लगता है।

+2

इच्छा है कि मैं अपने 2 दिन पहले लिखने से पहले इस बारे में जानूंगा। –

3

तुम सिर्फ सभी तत्वों को एक निश्चित मानदंड को पूरा करने के लिए सूची को फ़िल्टर करना चाहते हैं, तो सबसे सीधा रास्ता अंतर्निहित उपयोग करने के लिए है filter फ़ंक्शन में।

a_list = [10,2,3,8,1,9] 

# filter all elements smaller than 6: 
filtered_list = filter(lambda x: x<6, a_list) 

filtered_list में शामिल होंगे:

[2, 3, 1] 

नोट: इस विधि सूची के आदेश पर निर्भर नहीं करता तो के लिए बहुत बड़ी ही इस सूची

यहाँ एक उदाहरण है हो सकता है कि आदेशित खोज के लिए अनुकूलित एक विधि (bisect के रूप में) गति के संदर्भ में बेहतर प्रदर्शन करती है।

1

जॉन के उत्तर में जोड़ना, यदि आपको वास्तव में 6 से कम तत्वों को हटाने की आवश्यकता है और एक नया लौटने के बजाय सूची में समान संदर्भ रखना चाहते हैं।

del a[:bisect.bisect_right(a,6)] 

साथ ही आप नोट करना चाहिए कि bisect केवल एक क्रमबद्ध सूची पर काम करेंगे।

1

द्विभाजित छोड़ दिया और सही उदाहरण समारोह

प्रतिलिपि pastez के लिए!

def get_slice(list_, left, right): 
    return list_[bisect.bisect_left(list_, left):bisect.bisect_left(list_, right)] 
assert get_slice([0, 1, 1, 3, 4, 4, 5, 6], 1, 5) == [1, 1, 3, 4, 4] 
संबंधित मुद्दे