Python,奇怪的循环

时间:2017-06-24 00:29:45

标签: python loops for-loop

程序必须检测一个候选列表给出的单词的字谜。我设法把它弄好,除了最后一个循环的奇怪的东西:它应该丢弃具有不同数字的相同字母的单词发生,似乎工作正常,除非该单词有相似的连续字母,我不知道为什么。

def detect_anagrams(word,candidates):

    anagrams = []
    count = True
    for element in candidates:

        if set(element.lower()) == set(word.lower()):
            if element.lower() == word.lower():
                pass
            else:
                for char in element:
                    if element.count(char) == word.count(char):
                        count = True
                    else:
                        count = False
                if count == True:
                    anagrams.append(element)

    return anagrams

    pass

5 个答案:

答案 0 :(得分:0)

这种逻辑是错误的:

if element.count(char) == word.count(char):
    count = True
else:
    count = False

如果一个字母数不匹配,则允许下一个字母将count重置为True - 一旦字母无法匹配,就会退出循环,游戏结束。即使您之前这样做,也无法正确控制代码的这一部分。这是对代码的修改:

def detect_anagrams(word, candidates):

    word_lower = word.lower()
    word_set = set(word_lower)

    anagrams = []

    for candidate in candidates:

        candidate_lower = candidate.lower()

        if set(candidate_lower) == word_set:
            if candidate_lower != word_lower:
                for character in candidate_lower:
                    if candidate_lower.count(character) != word_lower.count(character):
                        break
                else:  # no break
                    anagrams.append(candidate)

    return anagrams

请注意,我们只需要小写并设置一组word一次,而不是每次循环迭代。另请注意,我在else(不在for上)使用了一个不常见的if,如果循环正常退出,则会触发,而不是通过break语句。

答案 1 :(得分:0)

由于您未能发布Minimal, complete, verifiable example,并且您的描述不是很清楚,我不确定您的程序应该如何工作。但是,我认为我可以发现逻辑问题。

            for char in element:
                if element.count(char) == word.count(char):
                    count = True
                else:
                    count = False
            if count == True:
                anagrams.append(element)

您遍历element中的所有字符,检查每对计数。但请注意,每次循环时都会重新分配count的值。当您到达if count == True时,您在循环中获得的唯一信息是count element中的 last 字符;所有其他信息都丢失了。我想你想知道任何计数是否匹配,而不仅仅是最后一个。这看起来像

            count = True
            for char in element:
                if element.count(char) != word.count(char):
                    count = False

            if count == True:
                anagrams.append(element)

这对你有用吗?

注意:我还没有清理你对布尔表达式的使用。试试这个:

            count = True
            for char in element:
                count = count and element.count(char) == word.count(char):

            if count:
                anagrams.append(element)

...或只是使用anyall运算符:

            if all [element.count(char) == word.count(char)
                    for char in element] :
                anagrams.append(element)

答案 2 :(得分:0)

我不确定你想要什么,但这部分绝对不正确:

           for char in element:
                if element.count(char) == word.count(char):
                    count = True
                else:
                    count = False

因为它完成了count变量的值,仅取决于char中的 last element(因为它的值在{{1}中循环反复重写)

答案 3 :(得分:0)

直接回复您的例子

detect_anagrams("good",["dog","goode"])

dog未被删除,因为标记count已设置回true。 将o的char dogelement.count(char)的char ogood word.count(char)中的char count进行比较时,您正在进行1 =的比较= 2?这不是真的,因此false标志设置为BREAK

但是因为没有g

dog中的下一个字符ggood中的字符count进行比较,您正在进行1 == 1的比较?这是真的。因此,您的程序会将标记true设置回word

您的代码所做的主要是比较element中的最后一个字符在候选人(?!<script[^>]*>)[(.*?)](?![^<]*<\/script>) 中出现的确切次数。这意味着你的程序将解释“臭名昭着的大”&#39;是西瓜的一个字谜。因为n在两个单词中都出现过一次。

答案 4 :(得分:0)

如果候选词的字母多于目标词,则考虑候选词是无效的,您可以使用内置any来检查是否有任何违规:

with open('corncob_lowercase.txt') as f:
    candidates = f.read().splitlines()

def detect_anagrams(word,candidates):
    anagrams = []
    for element in candidates:
        if element == word:
            continue
        if not any(element.count(char) > word.count(char) for char in element):
            anagrams.append(element)
    return anagrams

print(detect_anagrams('good',candidates))
  

['做','狗','去','上帝','goo']

单词列表链接:http://www.mieliestronk.com/corncob_lowercase.txt