从字符串中删除字符,有什么更有效的方法?

2024-09-28 23:37:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在网上学习Python2.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

我了解到没有字符串方法可以直接从字符串中删除字符,因为它们是不可变的,所以我提出了这个方法。我已经成功地提交了一个正确的答案,但我不太满意,因为我觉得有一种更有效的方法来做。在


Tags: 方法字符串in列表forstringdefascii
3条回答

最快的方法是在此处使用str.translate

>>> lettersGuessed = ['a', 'b', 'c']
>>> 'wedqwdasdasccdshjasdcas'.translate(None, ''.join(lettersGuessed))
'wedqwdsdsdshjsds'

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

str.joinfilter相比的计时结果,取自@thefourtheye的溶液:

^{pr2}$

输出:

filter > 6.49355100548
.join > 4.02496357229
trans > 0.69938109531

最有效的方法是使用^{}将字符序列转换为新字符串:

return ''.join([char for char in string.ascii_lowercase if char not in lettersGuessed])

这避免了在循环的每次迭代中都创建一个新的string对象;相反,新字符串只创建一次。在

您可以像这样使用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")

输出

^{pr2}$

或者,您可以像这样使用filter函数

import string
def getAvailableLetters(lettersGuessed):
    return filter(lambda x: x not in lettersGuessed, string.ascii_lowercase)

print getAvailableLetters("Welcome")

输出

^{pr2}$

编辑:性能比较

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方法。在

相关问题 更多 >