2013-03-15 8 views
10

स्ट्रिंग s से सभी लोअरकेस सबस्ट्रिंग को हटाने के लिए पाइथन (सादा या numpy का उपयोग करके) में एक कुशल तरीका क्या है?तेज़ तरीका?

s = "FOObarFOOObBAR" 
remove_lower(s) => "FOOFOOBAR" 

उत्तर

18

मैं str.translate का उपयोग करेंगे। यदि आप अनुवाद तालिका के लिए None पास करते हैं तो केवल डिलीट चरण ही किया जाता है। इस मामले में, मैं हटाए जाने वाले अक्षरों के रूप में ascii_lowercase पास करता हूं।

>>> import string 
>>> s.translate(None,string.ascii_lowercase) 
'FOOFOOOBAR' 

मैं तुम्हें एक तेज़ तरीका मिल जाएगा शक है, लेकिन वहाँ हमेशा timeit है विभिन्न विकल्पों की तुलना करने के अगर किसी को प्रेरित है :)।

+1

स्ट्रिंग मॉड्यूल पदावनत नहीं है? –

+0

@DiegoHerranz - ऐसा प्रतीत नहीं होता है। [संदर्भ दस्तावेज़] पर "depr" के लिए एक शब्द खोज करना (http://docs.python.org/3.4/library/string.html) कुछ भी चालू नहीं करता है। मुझे लगता है कि यह एक आम अफवाह है क्योंकि इसमें अधिकांश विधियां बिल्टिन 'स्ट्र' प्रकार पर बस उपनाम हैं, इसलिए उन्हें भविष्य में बहिष्कृत किया जा सकता है। – mgilson

+2

मुझे लगता है कि बहिष्कृत किया गया था (विधियों के कार्य संस्करण)। उदाहरण के लिए, पायथन 3.3 में, केवल 'ascii_lowercase' और' विराम चिह्न 'और' फॉर्मेटर 'और' टेम्पलेट 'जैसी कक्षाएं हैं। कोई 'rindex' या' split' नहीं है। – DSM

9

मेरा पहला दृष्टिकोण ''.join(x for x in s if not x.islower())

आप गति उपयोग mgilson जवाब की जरूरत है, यह एक बहुत तेजी से होता है किया जाएगा।

>>> timeit.timeit("''.join(x for x in 'FOOBarBaz' if not x.islower())") 
3.318969964981079 

>>> timeit.timeit("'FOOBarBaz'.translate(None, string.ascii_lowercase)", "import string") 
0.5369198322296143 

>>> timeit.timeit("re.sub('[a-z]', '', 'FOOBarBaz')", "import re") 
3.631659984588623 

>>> timeit.timeit("r.sub('', 'FOOBarBaz')", "import re; r = re.compile('[a-z]')") 
1.9642360210418701 

>>> timeit.timeit("''.join(x for x in 'FOOBarBaz' if x not in lowercase)", "lowercase = set('abcdefghijklmnopqrstuvwxyz')") 
2.9605889320373535 
+3

+1 दोनों मौजूदा उत्तरों के लिए, लेकिन मैं इसे दो कारणों से पसंद करता हूं। # 1 यह है कि मैं हर समय जीनेक्स का उपयोग करता हूं और इसलिए मुझे वाक्यविन्यास के बारे में सोचना नहीं है। मैं कभी याद नहीं कर सकता कि 'अनुवाद' और 'maketrans' कैसे काम करते हैं। # 2 यह है कि यह दृष्टिकोण अधिक मजबूत है: यदि आवश्यकताएं थोड़ी-थोड़ी बदलती हैं तो यह जीवित रहने की अधिक संभावना है। – DSM

+0

@DSM - मुझे याद रखना मुश्किल था कि 'अनुवाद' और 'maketrans' कितनी देर तक काम करते हैं, लेकिन मुझे इसका उपयोग मिल गया है। कष्टप्रद भाग यह है कि python3.x तक कोई 'str.maketrans' नहीं है, इसलिए यदि आप वास्तव में अनुवाद तालिका का उपयोग करना चाहते हैं तो आपको वास्तव में' आयात 'स्ट्रिंग की आवश्यकता होती है। – mgilson

+1

यह देखना दिलचस्प हो सकता है कि यदि आप निम्न-केस वर्णों का स्थानीय 'सेट' बनाते हैं तो प्रदर्शन इस पर कैसे बदलता है। फिर आप 'x.islower()' को देखने के बजाय सेट में सदस्यता के लिए परीक्षण कर सकते हैं। बेशक, आप शायद तब तक कुछ नहीं प्राप्त करते जब तक कि आप सेट को पूर्व-गणना नहीं कर सकते। आप प्रत्येक पुनरावृत्ति पर ऐसा नहीं करना चाहते हैं। इसे लगभग 30% तक बढ़ाने के लिए (मेरे अनुभवजन्य समाप्ति के आधार पर - कोई वास्तविक समय नहीं), आप जनरेटर अभिव्यक्ति के बजाय सूची-कंप का भी उपयोग कर सकते हैं। – mgilson

2
import re 

remove_lower = lambda text: re.sub('[a-z]', '', text) 

s = "FOObarFOOObBAR" 
s = remove_lower(s) 

print(s) 
संबंधित मुद्दे