当对答案有疑问时,值得尝试一些并计时:
PS C:\python33> .\python.exe lib\timeit.py -s @"
s = 'Hello, my name is [lol] bob [not[really]] john[son]'
"@ @"
for x in frozenset(s)-frozenset('[]'):
s = s.replace(x, '')
"@
1000000 loops, best of 3: 0.844 usec per loop
PS C:\python33> .\python.exe lib\timeit.py -s @"
s = 'Hello, my name is [lol] bob [not[really]] john[son]'
"@ "''.join(c for c in s if c in '[]')"
100000 loops, best of 3: 4.79 usec per loop
PS C:\python33> .\python.exe lib\timeit.py -s @"
s = 'Hello, my name is [lol] bob [not[really]] john[son]'
"@ @"
s.translate(str.maketrans('','',''.join(set(s)-set('[]'))))
"@
100000 loops, best of 3: 8.5 usec per loop
PS C:\python33> .\python.exe lib\timeit.py -s @"
s = 'Hello, my name is [lol] bob [not[really]] john[son]'
"@ "''.join(filter(lambda x: x in '[]', s))"
100000 loops, best of 3: 9.67 usec per loop
PS C:\python33> .\python.exe lib\timeit.py -s @"
s = 'Hello, my name is [lol] bob [not[really]] john[son]'
import re
"@ "re.sub('[^][]', '', s)"
100000 loops, best of 3: 15.9 usec per loop
所以@guess 现在删除的答案在要删除的字符集上使用s.replace() 似乎是最快的,而正则表达式替换最慢(但那是 Python 3.3 和我的机器,其他可能会有所不同)。
另请注意,如果您将上述所有设置字符串替换为:
s = 'Hello, my name is [lol] bob [not[really]] john[son]'*1000
那么我得到的时间是:
10000 loops, best of 3: 190 usec per loop
100 loops, best of 3: 3.6 msec per loop
100 loops, best of 3: 4.25 msec per loop
100 loops, best of 3: 8.72 msec per loop
100 loops, best of 3: 7.13 msec per loop
所以re.sub 的扩展性比lambda 解决方案更好,但除此之外,其他解决方案保持相同的相对位置。