【问题标题】:Removing letters from a string that occur in the previous string从字符串中删除前一个字符串中出现的字母
【发布时间】:2014-11-20 15:50:54
【问题描述】:

我需要定义一个名为 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))

【问题讨论】:

  • return ''.join(c for c in str2 if c not in str1)

标签: python string function python-3.3


【解决方案1】:

您可以为此使用str.translate 和str.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
>>>

【讨论】:

    【解决方案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 并从 str2_list 中删除 str1 中的任何字符,然后在列表上使用 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)
    

    【讨论】:

    • 这是完美的谢谢。扩展上述问题。我为此创建了一个包含多个字符串的测试函数,但是在调用它时它只返回最后一个字符串的结果,而不是前两个。我在上面提出的问题的代码。 @padraiccunningham
    • 将您的退货移出循环。缩进四个空格
    • 我之前尝试过,它实现了为每组字符串打印“原始单词是”,但不是为结果。
    • 抱歉,您以为您要返回一个列表,要么将结果存储在一个列表中并返回它,要么只在循环中使用打印语句,print ('The result is', remove_letters(str1,str2)) 而不是返回
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多