我目前正在通过在线课程学习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
我已经知道没有字符串方法可以直接从字符串中删除字符串,因为它们是不可变的,所以我想出了这个。我已成功提交了正确答案,但我对此并不十分满意,因为我觉得这样做是一种更有效的方法。
答案 0 :(得分:6)
最快的方法是在这里使用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
答案 1 :(得分:4)
您可以像这样使用list comprehension过滤掉lettersGuessed
import string
def getAvailableLetters(lettersGuessed):
return "".join([char for char in string.ascii_lowercase if char not in lettersGuessed])
print getAvailableLetters("Welcome")
<强>输出强>
abdfghijknpqrstuvwxyz
或者,您可以使用filter这样的功能
import string
def getAvailableLetters(lettersGuessed):
return filter(lambda x: x not in lettersGuessed, string.ascii_lowercase)
print getAvailableLetters("Welcome")
<强>输出强>
abdfghijknpqrstuvwxyz
修改:效果比较
import string
def getAvailableLetters(lettersGuessed):
return filter(lambda x: x not in lettersGuessed, string.ascii_lowercase)
def getAvailableLetters1(lettersGuessed):
return "".join([char for char in string.ascii_lowercase if char not in lettersGuessed])
from timeit import timeit
print timeit("getAvailableLetters('Welcome')", setup="from __main__ import getAvailableLetters")
print timeit("getAvailableLetters1('Welcome')",setup="from __main__ import getAvailableLetters1")
我机器上的输出
3.02976298332
2.00461006165
它表明,list comprehension
方法胜过filter
方法。
答案 2 :(得分:2)
最有效的方法是使用str.join()
将一系列字符转换为新字符串:
return ''.join([char for char in string.ascii_lowercase if char not in lettersGuessed])
这避免了每次迭代循环时创建一个新的字符串对象;相反,新字符串创建一次。