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
दृष्टिकोण और मेरा पहला समाधान वर्गबद्ध समय लेना समाप्त कर देगा, लेकिन समाधान रैखिक समय में चलना चाहिए।
स्रोत
2015-06-02 20:40:40
यदि सूची '['सेब', 'केला'] है, और स्ट्रिंग '' बनपप्लाना 'है, तो क्या यह' '' या 'केला' बनना चाहिए? आपका वर्तमान कोड '' '' का उत्पादन करेगा। – user2357112