基本上我想删除字符串中的一个字符,如果它多次出现一次。
例如: - 如果我有一个单词abaccea和字符'a',那么函数的输出应该是baccea,abacce,abccea。
我读到我可以为一个空字符串创建maketrans,但它会替换字符串中的每个字符串。
除了记下列表中的所有位置然后替换并生成单词之外,还有一种有效的方法吗?
答案 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'
>>>