Python 3.6
我想从字符串中删除字符串列表。这是我第一次尝试不好:
string = 'this is a test string'
items_to_remove = ['this', 'is', 'a', 'string']
result = list(filter(lambda x: x not in items_to_remove, string.split(' ')))
print(result)
输出:
['test']
但如果x
没有很好的间隔,这不起作用。我觉得必须有一个内置的解决方案,嗯必须有更好的方法!
我已经看过堆栈溢出的这个discussion,确切的问题就像我的......
不要浪费我的努力。我计时了所有的解决方案。我相信最简单,最快速和最pythonic的是简单的for循环。这不是其他帖子的结论......
result = string
for i in items_to_remove:
result = result.replace(i,'')
测试代码:
import timeit
t1 = timeit.timeit('''
string = 'this is a test string'
items_to_remove = ['this', 'is', 'a', 'string']
result = list(filter(lambda x: x not in items_to_remove, string.split(' ')))
''', number=1000000)
print(t1)
t2 = timeit.timeit('''
string = 'this is a test string'
items_to_remove = ['this', 'is', 'a', 'string']
def sub(m):
return '' if m.group() in items_to_remove else m.group()
result = re.sub(r'\w+', sub, string)
''',setup= 'import re', number=1000000)
print(t2)
t3 = timeit.timeit('''
string = 'this is a test string'
items_to_remove = ['this', 'is', 'a', 'string']
result = re.sub(r'|'.join(items_to_remove), '', string)
''',setup= 'import re', number=1000000)
print(t3)
t4 = timeit.timeit('''
string = 'this is a test string'
items_to_remove = ['this', 'is', 'a', 'string']
result = string
for i in items_to_remove:
result = result.replace(i,'')
''', number=1000000)
print(t4)
输出:
1.9832003884248448
4.408749988641971
2.124719851741177
1.085117268194475
答案 0 :(得分:4)
如果您对字符串间距不自信,可以使用string.split()
。
string.split()
和string.split(' ')
的工作方式略有不同:
In [128]: 'this is a test'.split()
Out[128]: ['this', 'is', 'a', 'test']
In [129]: 'this is a test'.split(' ')
Out[129]: ['this', '', '', '', '', 'is', '', '', 'a', 'test']
前者在没有任何冗余空字符串的情况下拆分你的字符串。
如果你想要更高的安全性,或者你的字符串可能包含标签和换行符,还有另一个正则表达式解决方案:
In [131]: re.split('[\s]+', 'this is \t a\ntest', re.M)
Out[131]: ['this', 'is', 'a', 'test']
最后,我建议您将查找列表转换为查找set
,以便在过滤器中进行有效查找:
In [135]: list(filter(lambda x: x not in {'is', 'this', 'a', 'string'}, string.split()))
Out[135]: ['test']
虽然在性能方面,列表组件比过滤器快一点,但不那么简洁:
In [136]: [x for x in string.split() if x not in {'is', 'this', 'a', 'string'}]
Out[136]: ['test']