我目前正在通过在线类(class)学习 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
我知道没有像字符串方法这样的东西可以直接从字符串中删除一个字符,因为它们是不可变的,所以我想到了这个。我已经成功提交了一个正确的答案,但我对它不太满意,因为我觉得有一种更有效的方法可以做到这一点。
最快的方法是在此处使用 str.translate
:
>>> lettersGuessed = ['a', 'b', 'c']
>>> 'wedqwdasdasccdshjasdcas'.translate(None, ''.join(lettersGuessed))
'wedqwdsdsdshjsds'
如果 lettersGuessed
已经是一个字符串,则删除 ''.join
调用。
与 str.join
和 filter
相比的计时结果,取自@thefourtheye 的解决方案:
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")
输出:
filter--> 6.49355100548
.join--> 4.02496357229
trans--> 0.69938109531