代码之家  ›  专栏  ›  技术社区  ›  Daniel

我有一组要排除的单词,我想检查输入的每个新单词是否完全包含在另一个单词中。我该怎么做?

  •  -1
  • Daniel  · 技术社区  · 6 月前

    因此,我目前正在制作一个文字游戏,我想让用户无法输入一个完全包含在另一个单词中的单词(例如“子集”中的“set”),但我目前的代码是:

    noWord = False
    for _word in used_words:
        if set(word).issubset(set(_word)):
            noWord = True
    if noWord == False:
        # Calculate score for the word
    

    使字母的顺序无关紧要(例如,玩“音高”会阻止你玩“筹码”),这是我不想要的功能。我该如何高效地完成这项工作。

    我尝试将_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)),但我仍然这样做)

    提前感谢:)

    1 回复  |  直到 6 月前
        1
  •  0
  •   chrslg    6 月前

    就是这样 set 做。 设置 创建a 设置 (这是一个没有任何顺序的集合,其目的是验证什么属于它,什么包含在其中。好吧,集合。就像数学一样)。

    要构建一个集合,您可以调用 设置 还有另一组东西。喜欢 S=set([3, 1, 2]) 是包含数字1、2和3的集合。那么 set([1,3]).issubset(S) 为True,因为set {1,3} 包含在套件中 {1,2,3}

    当你打电话的时候 设置 对于不是集合的东西,你会得到一个错误。 set(1) 引发错误。

    现在,你打电话来了 设置 你认为这是一个“原子”值。所以,你可能会认为它应该引发一个错误。但是字符串是一个集合:字符的集合。所以 S=set("hello") 该集合真的包含 {'h', 'e', 'l', 'o'} (以任何顺序)。还有 T=set("lol") 也是一组, {'o','l'} (我以随机顺序显示它们,因为就像数学一样,没有顺序)。

    所以 T.issubset(S) 这里是真的。因为所有的元素 T 也是元素 S .

    现在,这就是“为什么”。至于“如何”,很简单:

    "set" in "subset"
    

    这是真的。

    这一次,正如你所期望的那样:因为字符串“set”包含在字符串“subset”中。

    要检查一个单词是否是列表中任何单词的一部分,您可以

    L=["subset", "hello", "world"] # example list of words
    any("set" in x for x in L) # True, because "set" is substring of one of the words of L
    any("lol" in x for x in L) # False, because "lol" is substring of no word x of L