从String中删除char,有什么更有效的方法呢?

Her*_*ari 2 python string performance python-2.7

我目前正在从在线课程学习Python 2.7.其中一个问题是我必须从字符列表中删除字符串中的字符.

我做的是:

def getAvailableLetters(letters):

    alphabet = string.ascii_lowercase
    reduced_alphabet = ''

    for char in alphabet:
        if char not in lettersGuessed:
            reduced_alphabet += char

    return reduced_alphabet
Run Code Online (Sandbox Code Playgroud)

我已经知道没有字符串方法可以直接从字符串中删除字符串,因为它们是不可变的,所以我想出了这个.我已经成功地提交了一个正确的答案,但我对此并不十分满意,因为我觉得有一种更有效的方法.

Ash*_*ary 6

最快的方法是在str.translate这里使用:

>>> lettersGuessed = ['a', 'b', 'c']
>>> 'wedqwdasdasccdshjasdcas'.translate(None, ''.join(lettersGuessed))
'wedqwdsdsdshjsds'
Run Code Online (Sandbox Code Playgroud)

如果lettersGuessed已经是字符串,则删除该''.join调用.

时间结果与@thefourtheye的解决方案相比较,str.join并且filter取自:

def getAvailableLetters2(lettersGuessed):
    return string.ascii_lowercase.translate(None, lettersGuessed)

from timeit import timeit
print 'filter-->', timeit("getAvailableLetters('Welcome')", setup="from __main__ import getAvailableLetters")
print '.join-->', timeit("getAvailableLetters1('Welcome')",setup="from __main__ import getAvailableLetters1")
print 'trans-->', timeit("getAvailableLetters2('Welcome')",setup="from __main__ import getAvailableLetters2")
Run Code Online (Sandbox Code Playgroud)

输出:

filter--> 6.49355100548
.join--> 4.02496357229
trans--> 0.69938109531
Run Code Online (Sandbox Code Playgroud)

  • 我经常忘记`translate`以及删除*字符的好处. (2认同)
  • @thefourtheye:C string magic; C中的查找表直接在字符串字节上操作. (2认同)