程序必须检测一个候选列表给出的单词的字谜。我设法把它弄好,除了最后一个循环的奇怪的东西:它应该丢弃具有不同数字的相同字母的单词发生,似乎工作正常,除非该单词有相似的连续字母,我不知道为什么。
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
答案 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)
...或只是使用any
和all
运算符:
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 dog
与element.count(char)
的char o
与good
word.count(char)中的char count
进行比较时,您正在进行1 =的比较= 2?这不是真的,因此false
标志设置为BREAK
但是因为没有g
dog
中的下一个字符g
与good
中的字符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']