一次移除字符串中的一个字符

4 投票
4 回答
2303 浏览
提问于 2025-04-16 08:11

基本上,我想要逐个删除字符串中的某个字符,如果这个字符出现了多次。

比如说:如果我有一个单词 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']

你可以把这个变成一个生成器,只需把方括号换成圆括号就可以了。

撰写回答