2

我目前正在通过在线课程学习 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

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

4

3 回答 3

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
于 2013-11-08T12:02:37.877 回答
4

您可以像这样使用列表理解来过滤掉其中的字符lettersGuessed

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

print getAvailableLetters("Welcome")

输出

abdfghijknpqrstuvwxyz

或者,您可以使用这样的过滤器功能

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

于 2013-11-08T11:54:29.983 回答
2

最有效的方法是str.join()将一个字符序列转换为一个新字符串:

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

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

于 2013-11-08T11:55:19.770 回答