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

时间:2010-12-07 17:21:30

标签: python

基本上我想删除字符串中的一个字符,如果它多次出现一次。

例如: - 如果我有一个单词abaccea和字符'a',那么函数的输出应该是baccea,abacce,abccea。

我读到我可以为一个空字符串创建maketrans,但它会替换字符串中的每个字符串。

除了记下列表中的所有位置然后替换并生成单词之外,还有一种有效的方法吗?

4 个答案:

答案 0 :(得分: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']

通过简单地用圆形方括号替换方括号,可以将其变成发电机。

答案 1 :(得分: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']

干杯

答案 2 :(得分: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 :(得分:-2)

怎么样?

>>> def replace_a(word):
...     word = word[1:8]
...     return word
... 
>>> replace_a("abaccea")
'baccea'
>>>