2015-06-02 3 views
9

स्ट्रिंग से सबस्ट्रिंग्स की सूची को निकालने का सबसे प्रभावी तरीका क्या है?स्ट्रिंग से एकाधिक सबस्ट्रिंग को हटाने का सबसे प्रभावी तरीका?

मैं एक क्लीनर, तेज तरीका क्या करना चाहते हैं निम्नलिखित:

words = 'word1 word2 word3 word4, word5' 
replace_list = ['word1', 'word3', 'word5'] 

def remove_multiple_strings(cur_string, replace_list): 
    for cur_word in replace_list: 
    cur_string = cur_string.replace(cur_word, '') 
    return cur_string 

remove_multiple_strings(words, replace_list) 
+1

यदि सूची '['सेब', 'केला'] है, और स्ट्रिंग '' बनपप्लाना 'है, तो क्या यह' '' या 'केला' बनना चाहिए? आपका वर्तमान कोड '' '' का उत्पादन करेगा। – user2357112

उत्तर

11

Regex:

>>> import re 
>>> re.sub(r'|'.join(map(re.escape, replace_list)), '', words) 
' word2 word4, ' 

एक लाइनर ऊपर वास्तव में नहीं के रूप में तेजी से अपने string.replace संस्करण के रूप में है, लेकिन निश्चित रूप से छोटा:

>>> words = ' '.join([hashlib.sha1(str(random.random())).hexdigest()[:10] for _ in xrange(10000)]) 
>>> replace_list = words.split()[:1000] 
>>> random.shuffle(replace_list) 
>>> %timeit remove_multiple_strings(words, replace_list) 
10 loops, best of 3: 49.4 ms per loop 
>>> %timeit re.sub(r'|'.join(map(re.escape, replace_list)), '', words) 
1 loops, best of 3: 623 ms per loop 

गोश! लगभग 12x धीमा।

लेकिन क्या हम इसे सुधार सकते हैं? हाँ।

हम केवल शब्द हम क्या कर सकते हैं बस \w+ का उपयोग कर words स्ट्रिंग से शब्दों को फ़िल्टर और यह replace_list का एक सेट के खिलाफ तुलना कर रहा है के साथ संबंध रहे हैं (हाँ एक वास्तविक set: set(replace_list)):

>>> def sub(m): 
    return '' if m.group() in s else m.group() 
>>> %%timeit 
s = set(replace_list) 
re.sub(r'\w+', sub, words) 
... 
100 loops, best of 3: 7.8 ms per loop 

यहां तक ​​कि बड़ी स्ट्रिंग और शब्दों के लिए string.replace दृष्टिकोण और मेरा पहला समाधान वर्गबद्ध समय लेना समाप्त कर देगा, लेकिन समाधान रैखिक समय में चलना चाहिए।

+3

यह निश्चित रूप से क्लीनर है, लेकिन क्या यह तेज़ है? –

+0

वही है जो मैं सोच रहा था! –

+2

@CyberneticTwerkGuruOrc: डुनो, लेकिन यह निश्चित रूप से banappleana समस्या नहीं है। – user2357112

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

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