一次移除字符串中的一个字符
基本上,我想要逐个删除字符串中的某个字符,如果这个字符出现了多次。
比如说:如果我有一个单词 abaccea 和字符 'a',那么这个函数的输出应该是 baccea、abacce 和 abccea。
我看到可以用 maketrans 把 'a' 替换成空字符串,但这样会把字符串中的每个 'a' 都替换掉。
除了记录所有位置到一个列表里,然后再替换生成单词,还有没有更有效的方法呢?
4 个回答
1
我觉得你的做法听起来不错——这是一个相对高效的方法,读者也能清楚地理解你在做什么。
不过,有一种稍微不那么优雅但可能更快的替代方法,就是使用 find
函数的 start
参数。
i = 0
while True:
j = word.find('a', i)
if j == -1:
break
print word[:j] + word[j+1:]
i = j + 1
find 函数可能在 C 语言中进行了高度优化,所以和你在 Python 中自己逐个遍历字符串的做法相比,这可能会让你的程序运行得更快。不过,你是否选择这种方法,取决于你是更看重效率还是优雅。我建议你先选择简单明了的方法,只有在性能分析显示效率是个重要问题时,再考虑优化。
这里有一些性能测量,显示使用 find
的代码可以运行得更快:
>>> method1='[s[:key] + s[key+1:] for key,val in enumerate(s) if val == "a"]' >>> method2=''' result=[] i = 0 while True: j = s.find('a', i) if j == -1: break result.append(s[:j] + s[j+1:]) i = j + 1 ''' >>> timeit.timeit(method1, init, number=100000) 2.5391986271997666 >>> timeit.timeit(method2, init, number=100000) 1.1471052885212885
3
你可以试试下面这个脚本。它提供了一个简单的功能,可以完成你想要的事情。使用列表推导式 [x for x in y if something(x)]
是非常值得学习的。
#!/usr/bin/python
word = "abaccea"
letter = "a"
def single_remove(word, letter):
"""Remove character c from text t one at a time
"""
indexes = [c for c in xrange(len(word)) if word[c] == letter]
return [word[:i] + word[i + 1:] for i in indexes]
print single_remove(word, letter)
返回的结果是 ['baccea', 'abccea', 'abacce']
祝好
5
这里有一个简单的方法:
In [6]: s = "abaccea"
In [9]: [s[:key] + s[key+1:] for key,val in enumerate(s) if val == "a"]
Out[10]: ['baccea', 'abccea', 'abacce']
你可以把这个变成一个生成器,只需把方括号换成圆括号就可以了。