【问题标题】:How to check if a certain word can be used for another word in Python如何检查某个单词是否可以用于Python中的另一个单词
【发布时间】:2020-09-11 06:58:12
【问题描述】:

和平,

f.ex.:

你的词是"AAAaaaaa",你想检查你可以用它从另一个列表中创建哪些词。

f.ex.列表中有:

AA

AAH

AAHED

AAHING

AAHS

AAL

AALII

AALIIS

AALS

所以唯一的输出应该是"AA",因为你不能创建你错过字母的东西。

到目前为止,我得到了这个,但它会输出列表中包含"A" 的每个单词。

with open("sowpods.txt", "r") as check: #TOWORK WITH
        for line in check.readlines():
                for x in word:
                        for y in line:
                                if x in y:
                                        valid_words.append(line.strip())

【问题讨论】:

    标签: python list for-loop division readlines


    【解决方案1】:

    你可以使用filter

        word = "ZZAAEE"
        existing = ["AA", "AAH", "ZEZE", "AAHING", "AAHS"]
        valid_words = []
    
        def cmp_str(exist): # exist is one item in existing list
            copy_word = str(word) # so to not modified the word
            for c in exist:
                idx = copy_word.find(c) # find the index of char in word
                if idx == -1:
                    return False
                copy_word = copy_word[:idx] + copy_word[idx+1:] # drop the match character
    
            return True
    
        valid_words = list(filter(cmp_str, existing)) # cmp_str is called by the filter function
        print(valid_words)
    

    PS:更新代码,因为字符的位置应该被忽略

    【讨论】:

    • 哦,哇,这令人印象深刻,谢谢您的回答。不知道该功能,但是,在这种情况下它可以工作。但实际上我有一点心理障碍,f.ex。如果 ZZAAEE 是单词,如果列表中是 ZEZE,它应该输出 true,因为字母在哪个位置无关紧要。你能帮我弄清楚这个吗?
    • 您好,先生,谢谢,是的,几乎完全符合我的目的。但如果可能的话,我想如果这个词是“ZZAAI”,它不应该输出“ZIZ​​Z”,因为字母不能重复使用。因此,如果“ZIZZ”存在,它不应该在 valid_words 中,因为您不能重复使用字母。 U 每个字母只能使用一次。希望你能用这种方法帮助我
    • 对不起。我刚刚在我的代码中发现了一个错误。我已经更新了我的答案。请再试一次
    • 我明天试试,谢谢你的帮助,我会及时通知你
    • 谢谢您,先生,这很有效。我真的不明白它是如何工作的,因为在 def cmp_str 中你使用存在作为参数,但是在你过滤 cmp_str 和现有的函数本身时,你并没有真正为它输入任何东西。所以我猜在这种情况下,现有列表在某种程度上是“存在”的“参数”?
    【解决方案2】:

    我认为你可以采用这样的逻辑:

    s= "AAAaaaaa"
    list =["AA","AAH", "AAHED","AAHING", "AAHS"]
    valid_words=[]
    
    flag = True
    for i in range(0,len(list)):
      for j in range (0,len(list[i])):
        if list[i][j] in s :
          continue
        else:
          flag = False
          break
      if flag :
        print (list[i] + " exists")
        valid_words.append(list[i])
    

    【讨论】:

      【解决方案3】:
      In [1]: words = ['ZIZ', 'ZIZZ', 'ZZI']
      
      In [2]: w = "ZZAAI"
      
      In [3]: for word in words:
          ...:     match=False
          ...:     chars = list(word)
          ...:     for i in list(w):
          ...:         if i in chars:
          ...:             match = True
          ...:             chars.remove(i)
          ...:         else:
          ...:             match=False
          ...:     if len(chars) == 0:
          ...:         print(word)
          ...:     elif not set(chars).issubset(list(w)):
          ...:         print(word)
      

      【讨论】:

      • 哇,谢谢先生,这对我的目的来说几乎是完美的。但是我真的不知道这里发生了什么。这里唯一的问题是:f.ex。你得到了“ZZAAI”,即使它不应该输出它,他也会输出“ZIZ​​Z”,因为我的话中有 zust 2 Z,而“ZIZZ”不能由“ZZAAI”制成。知道如何完成这项工作吗?
      • 检查我编辑的帖子,看看它是如何工作的。可能对您的第二个问题也有帮助。
      • 谢谢您的解释,先生,我基本上明白了。如果我做对了,使用这种带有“issubset”的方法,实际上不可能检查这些字母是否每个只使用一次。还是我们必须以某种方式修改 rset,以使该字母以某种方式“删除”?先生,完成这项工作的最简单方法是什么?
      • 所以您只想要单词中的唯一单词或唯一字符?
      • 我猜是性格。 f.ex.:我的单词是“ZZAAI”,我将它与充满单词的列表进行比较:它不应该输出“ZIZ​​Z”,因为我们没有 3 个 Z,只有 2 个 Z,但在这种方法中它输出“ZIZ​​Z” " 因为它不排除已经使用过的字母。 “ZIZ”可以,但“ZIZZ”不应该输出。这意味着,如果使用了一个字母,就不能再次使用它来组成一个单词。希望我能以某种方式解释清楚。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 2020-03-22
      • 1970-01-01
      相关资源
      最近更新 更多