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

subtract a string from another string

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

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:])

使用递归但得到 none 作为答案。想了解哪里出了问题或有更好的方法。

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

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)

使用setsdifference()方法

str1="sdfjhasdklfd"
str2="sdfjkfdgpoel"

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

print (k1.difference(k2))

先将它们转化为一个集合,然后再求不同。

试试这个:

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

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

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

这个很简单。使用一组:

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

好的,首先,假设您调用了函数:

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 语句中,您正在删除您想要删除的内容 return,因此很明显,您将得到 none.

在 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

你可以像这样用 .replace() 来做:

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

结果输出为:

United