检查一个列表是否被另一个列表包含而没有重用



需要帮助,以便用户输入" good "它不应该从上面的字母打印。如果用户输入的god是有效的word

valid  = ['g', 'o', 'o', 'd', 'c']
print(valid)
word = input('please make a word using above letters: ')
if any(letter in word for letter in valid):
print('yes valid word')
else:
print('not from the above letter')

您可以创建一个包含字母计数的计数器,然后使用它来比较有效列表中的字母计数是否大于或等于该字母在单词

中的出现次数
from collections import Counter
v_count = Counter(valid)
all(v_count[letter] >= word.count(letter) for letter in set(word))

使用Counters的另一个选项是将计数器中的当前单词subtract,然后检查计数器中是否有任何元素的计数为负(或者相反,检查是否所有元素的计数为正)。

>>> from collections import Counter
>>> valid = ['g', 'o', 'o', 'd', 'c']
>>> word = "god"
>>> counter = Counter(valid)
>>> counter.subtract(word)
>>> all(count >= 0 for count in counter.values())
True

注意:subtract改变计数器的位置,所以你需要重新创建它,如果你需要执行这个检查与其他文字。

valid  = ['g', 'o', 'o', 'd', 'c']
def is_valid(test_word,alphabet):
valid_copy = alphabet[:]
for letter in test_word:
try: 
valid_copy.remove(letter)
except ValueError:
# there are no more of this letter in the word
print("Invalid Word")
return False
print("Valid Word")
return True

is_valid("good",valid)
is_valid("food",valid)

如果你需要快速测试很多单词,可能(肯定)有更好的方法来做这件事

另一种选择是使用以下方式:

valid  = ['g', 'o', 'o', 'd', 'c']
print(valid)
len_valid = len(valid)
word = input('please make a word using above letters: ')
def sample(valid):
if (len_valid - len(valid)) == len(word): 
print('yes valid word')
else:
print('not from the above letter')
for w in word:
if w not in valid:
break
elif w in valid:
valid.remove(w)
#print(w)
if len(word) != 0:
sample(valid)

最新更新