从另一个字符串中减去一个字符串

时间:2015-01-29 18:05:52

标签: python recursion

我试图从另一个字符串中减去一个字符串并尝试打印该字符串的其余字符。以下是我的代码:

def getAvailableLetters(lettersGuessed):
    s="abcdefghijklmnopqrstuvwxyz"
    k=list(s)
    str1=lettersGuessed
    str2=list(str1)
    if str2[0] in k:
        return k.remove(str2[0])
    else:
        return getAvailableLetters(lettersGuessed[1:])

使用递归但没有得到答案。想要了解出了什么问题或更好的方法。

7 个答案:

答案 0 :(得分:4)

试试这个:

s1='aabbccdd'
s2='abce'

l1=list(s1)
for c in s2:             # c will be each character of the string s2...
    try:
       l1.remove(c)      # try to remove the character...
    except ValueError:   
        # Open question: What if the character in c is not in s1?
        # not specified what 'abc'-'aaa' is or 'abc'-'ace'...
        # just pass -- it is not really defined  
        pass

print '{}-{}={}'.format(s1,s2,''.join(l1))
# aabbccdd-abce=abcdd

答案 1 :(得分:4)

这很简单。使用一套:

import string
def getAvailableLetters(lettersGuessed):
    return set(string.ascii_lowercase) - set(lettersGuessed.lower())

答案 2 :(得分:2)

使用difference()

sets方法
str1="sdfjhasdklfd"
str2="sdfjkfdgpoel"

k1=set(str1)
k2=set(str2)

print (k1.difference(k2))

首先将它们转换为集合,然后找出差异。

答案 3 :(得分:2)

s2中删除字符串s1中每个字符的一次出现:

def str_subtract(s1, s2):
    for ch in s2:
        if ch in s1:
            s1 = s1.replace(ch, '', 1)
    return s1

print(str_subtract('aabbccdd', 'abc'))  # --> abcdd
print(str_subtract('aabbccdd', 'abbc'))  # --> acdd

这是另一个可能更有效的版本。

try:
    from functools import reduce  # python 3?
except NameError:
    pass

def str_subtract(s1, s2):
    remove = (ch for ch in s2 if ch in s1)
    return reduce(lambda s, ch: s.replace(ch, '', 1), remove, s1)

print(str_subtract('aabbccdd', 'abc'))  # --> abcdd
print(str_subtract('aabbccdd', 'abbc'))  # --> acdd

答案 4 :(得分:0)

使用递归效率很低,尝试这样做:

def getAvailableLetters(lettersGuessed):
    s="abcdefghijklmnopqrstuvwxyz"
    set_to_remove = set(lettersGuessed)
    return ''.join([c for c in s if c not in set_to_remove])

太棒了,用python方式!


上述解决方案将同时消除所有实例。

更好的版本:

def getAvailableLetters(s, lettersGuessed):
    k = list(s)
    for c in lettersGuessed:
        try:
            k.remove(c)
        except ValueError:
            pass
    return ''.join(k)

答案 5 :(得分:0)

首先,假设您已经调用了函数:

getAvailableLetters('yourname')

然后str2将具有值:

str2 = ['y','o', 'u', 'r', 'n', 'a', 'm', 'e'] ##due to your list method

,k中的值将类似于:

k= ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

现在您看到str2只是k的一个子集,因为每个字母都位于k中的a-z内部。

然后在您删除时:

if str2[0] in k:
    return k.remove(str2[0])
else:
    return getAvailableLetters(lettersGuessed[1:])

在if语句中,您将删除要返回的内容,因此很显然,您将一无所获。

在else语句中,您将先前的第一个索引项设为0。之后,它也会被删除,因为每个字母都已经在k中。

def getAvailableLetters(lettersGuessed):
    s="abcdefghijklmnopqrstuvwxyz"
    k=list(s)
    str1=lettersGuessed
    str2=list(str1)
    for i in range(len(str2)):
        if str2[i] in k:
            k.remove(str2[i])
    return k
    print(getAvailableLetters('prakash'))
    
    ##this will remove all the characters that are in my name and return the rest of all the elements

答案 6 :(得分:0)

您可以使用.replace()来做到这一点:

str1 = "UnitedStates"
st2 = "States"
str = str1.replace("States", "")
print(str)

结果将是:

United