Python 从字符串中删除字符,什么';这是一种更有效的方法吗?

Python 从字符串中删除字符,什么';这是一种更有效的方法吗?,python,string,performance,python-2.7,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 += c

我目前正在网上学习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
我已经了解到,没有像字符串方法这样的东西可以直接从字符串中删除字符,因为它们是不可变的,所以我提出了这个方法。我已经成功地提交了一个正确的答案,但我对它不太满意,因为我觉得有一种更有效的方法可以做到这一点。

您可以这样使用,过滤掉
字母中的字符。

import string
def getAvailableLetters(lettersGuessed):
    return "".join([char for char in string.ascii_lowercase if char not in lettersGuessed])

print getAvailableLetters("Welcome")
输出

abdfghijknpqrstuvwxyz
abdfghijknpqrstuvwxyz
或者,您可以使用这样的函数

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

print getAvailableLetters("Welcome")
输出

abdfghijknpqrstuvwxyz
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

它表明,
列表理解
方法优于
过滤
方法。

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

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

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

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

>>> lettersGuessed = ['a', 'b', 'c']
>>> 'wedqwdasdasccdshjasdcas'.translate(None, ''.join(lettersGuessed))
'wedqwdsdsdshjsds'
如果
lettersGuessed
已经是一个字符串,则删除
''。加入
调用

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

我怀疑是
lambda
扼杀了
filter()
的性能。对于
过滤器(str.isupper,'abcABC')
'.join('abcABC'中的c代表c,如果c.isupper()])
filter()
获胜。
str.translate
击败两者。使用
functools.partial(operator.contains,lettsguesed)
使过滤器比
'.join()更快。但是
str.translate
仍然获胜。+1我想知道为什么
translate
是最快的。太棒了。我常常忘记了
翻译
,忘记了它对于删除字符有多么好。@MartijnPieters你能告诉我为什么
翻译
更快吗?它是如何在内部实现的?@thefourtheye:C string magic;C语言中直接在字符串字节上操作的查找表。@thefourtheye:这就是函数,用于Python3
bytes
type。
str
(unicode)类型也有一个,尽管在实现上略有不同;将
字符串.标点符号
替换为(从中创建的字符串)
字母