从前一个字符串中出现的字符串中删除字母

时间:2014-11-20 15:50:54

标签: python string function python-3.3

我需要定义一个名为remove_letters(str1,str2)的函数,该函数返回一个字符串,该字符串是从字符串2中删除str1中出现的每个字母

到目前为止,我已经有了这个,但它没有删除重复的字母,只删除了你要删除的内容。

def remove_letters(str1,str2):
    str2_list = list(str2)
    for char in str2:
         str2_list.remove()
         return (str2)

更新

我现在需要为各种字符串测试此函数。调用代码时,只返回最后一个结果,而不是前两个结果。这是我的代码。

def test_remove_letters():
    string_list = [('sop', 'sen'),('dog', 'god'),('lighter', 'darker')]
    for str1,str2 in string_list:
        print('The original words are', str1, 'and', str2)
        return ('The result is', remove_letters(str1,str2))

2 个答案:

答案 0 :(得分:4)

您可以使用str.translatestr.maketrans

>>> def remove_letters(str1,str2):
...     return str2.translate(str.maketrans('', '', str1))
...
>>> remove_letters('abc', 'aaabbbccc')
''
>>> remove_letters('abc', 'aaaxbbbycccz')
'xyz'
>>>

如果您使用timeit.timeit测试此解决方案,您会发现它非常有效:

>>> from timeit import timeit
>>>
>>> def remove_letters(str1,str2):
...     s = set(str1)
...     return "".join([char for char in str2 if char not in s])
...
>>> timeit("remove_letters('abc', 'aaaxbbbycccz')", "from __main__ import remove_letters")
6.056879016746539
>>>
>>> def remove_letters(str1,str2):
...     return str2.translate(str.maketrans('', '', str1))
...
>>> timeit("remove_letters('abc', 'aaaxbbbycccz')", "from __main__ import remove_letters")
5.283739134443065
>>>

答案 1 :(得分:2)

def remove_letters(str1,str2):
    s = set(str1)
    return "".join([char for char in str2 if char not in s])

或循环:

def remove_letters(str1, str2):
    res = ""  
    s = set(str1)
    for char in str2:
        if char not in s: 
            res += char
    return res

循环和列表推导都具有相同的逻辑,我们将字符保留在str2中,而不是出现在str1中。

使用您自己的代码,您需要遍历str2并从str1中的str2_list中删除任何char,然后使用列表中的join来获取字符串:

def remove_letters(str1,str2):
    str2_list = list(str2)
    for char in str2:
        if char in str1:
             str2_list.remove(char)
    return "".join(str2_list)