所以我目前正在制作一个文字游戏,我希望用户不能输入完全包含在另一个单词中的单词(例如“子集”中的“集合”),但是我当前的代码:
noWord = False
for _word in used_words:
if set(word).issubset(set(_word)):
noWord = True
if noWord == False:
# Calculate score for the word
使得字母的顺序无关紧要(例如,播放“pitch”会阻止您播放“chip”),这是我不想要的功能。我该如何有效地做到这一点。
我尝试将 _word 变量作为列表进行搜索,并检查该列表中的每组字母是否与 word 变量匹配,但这效率非常低。 例如
wordAsAList == list(_word)
# All words have to be 3 letters or more in my game
for v in range(len(wordAsAList) - 2):
for i in range(len(wordAsAList)):
if len(wordAsAList) - v - 3 >= i:
if ("".join(wordAsAList[i:(len(wordAsAList) - v)])) == word:
noWord = True
除此之外,我几乎不知道如何解决问题/使上面的代码更高效。 (我也知道我不应该使用 range(len(list)),但我仍然这样做)
提前致谢:)
这就是
set
的作用。 set
创建一个set
(这是一个没有任何顺序的集合,其目的是验证什么属于它,其中包含什么。嗯,集合。就像数学中的那样)。
要构建一个集合,您可以使用另一个事物集合来调用
set
。就像 S=set([3, 1, 2])
是包含数字 1、2 和 3 的集合。那么 set([1,3]).issubset(S)
就是 True,因为集合 {1,3}
包含在集合 {1,2,3}
中
当您不使用非集合的内容调用
set
时,您会收到错误。 set(1)
引发错误。
现在,在这里,你用字符串调用了
set
。您认为是“原子”值。因此,您可能认为它应该引发错误。但字符串是一个集合:字符的集合。所以 S=set("hello")
实际上是包含 {'h', 'e', 'l', 'o'}
的集合(以任意顺序)。 T=set("lol")
也是一个集合,{'o','l'}
(我以随机顺序显示它们,因为就像数学一样,没有顺序)。
所以
T.issubset(S)
在这里是真的。因为 T
的所有元素也是 S
的元素。
现在,这就是“为什么”。至于“如何”,很简单:
"set" in "subset"
是真的。
这一次,在您期望的意义上:因为字符串“set”包含在字符串“subset”中。