我试图从另一个字符串中减去一个字符串并尝试打印该字符串的其余字符。以下是我的代码:
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:])
使用递归但没有得到答案。想要了解出了什么问题或更好的方法。
答案 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