我的字谜代码不考虑多个字母
My anagram code doesn't account for multiple letters
所以我的代码得到两个单词,并检查一个是否是另一个的变位词。
然而,如果交换了多个字母,则不起作用,尽管我试图解释这一点。
storedword = input("Enter your primary word \t")
global word
word = list(storedword)
word3 = input("Enter anagram word \t")
word3lowercase = word3.lower()
anaw = list(word3lowercase)
counter = int(0)
letterchecker = int(0)
listlength = len(word)
newcounter = int(0)
if len(anaw) != len(word):
print ("not anagram")
if len(anaw) == len(word):
while counter < listlength and newcounter < listlength:
tempcount = 0
if anaw[counter] == word[newcounter]:
temp = word[newcounter]
word[newcounter] = word[tempcount]
word[tempcount]=temp
letterchecker +=1
counter +=1
tempcount +=1
newcounter = int(0)
else:
newcounter +=1
if counter == len(word):
print ("anagram")
else:
print ("not anagram")
我认为它在 if len(anaw)
部分之后出了什么问题,例如,如果主要单词是 "hannah",而次要单词是 "hannnn",它认为它是一个变位词。
这里可以实现更简单的逻辑,即使不使用 sorted
等。假设您有一个函数 anagram
:
def anagram(word1, word2):
if len(word1) != len(word2):
return False
def char_count(word):
char_count = {}
for c in word:
char_count[c] = char_count.get(c, 0) + 1
return char_count
cr1 = char_count(word1)
cr2 = char_count(word2)
return cr1 == cr2
您可以使用以下方法进行测试:
>>> print(anagram("anagram", "aanragm"))
True
>>> print(anagram("anagram", "aangtfragm"))
False
对于未来的读者,一个超级简单的 pythonic 解决方案可能是使用 Counter
:
from collections import Counter
>>> Counter(word1) == Counter(word2)
或使用sorted
:
>>> sorted(word1) == sorted(word2)
newcounter = int(0)
这是导致问题的行(在 while 循环中)。
因此,您会再次从头开始检查单词。
我想你希望它是 newcounter=letterchecker
。
由于已经使用的字符被放在 word
的前面,如果您以 letterchecker
开头,它们将被忽略
告诉我它是否有效
编辑:检查给出的示例,似乎有效。
[编辑这只是为了我无法阅读的回文]
这里有一些更简单的东西:
storedword = input("Enter your primary word \t")
word3 = input("Enter anagram word \t")
if storedword == word3[::-1]:
print "Is Anagram"
else:
print "Is not anagram"
如果不使用 sort
,您可以使用以下方法。它从第二个单词的字符数组中删除一个字母。如果没有剩余字母,则这些单词只是变位词(并且单词的开头长度相同且长度大于零):
word1="hannah"
word2="nahpan"
chars1= list(word1)
chars2= list(word2)
if len(chars1)==len(chars2) and len(chars1)>0:
for char in chars1:
if char not in chars2:
break
chars2.remove(char)
if len(chars2)==0:
print "Both words are anagrams"
else:
print "Words are not anagrams"
所以我的代码得到两个单词,并检查一个是否是另一个的变位词。
然而,如果交换了多个字母,则不起作用,尽管我试图解释这一点。
storedword = input("Enter your primary word \t")
global word
word = list(storedword)
word3 = input("Enter anagram word \t")
word3lowercase = word3.lower()
anaw = list(word3lowercase)
counter = int(0)
letterchecker = int(0)
listlength = len(word)
newcounter = int(0)
if len(anaw) != len(word):
print ("not anagram")
if len(anaw) == len(word):
while counter < listlength and newcounter < listlength:
tempcount = 0
if anaw[counter] == word[newcounter]:
temp = word[newcounter]
word[newcounter] = word[tempcount]
word[tempcount]=temp
letterchecker +=1
counter +=1
tempcount +=1
newcounter = int(0)
else:
newcounter +=1
if counter == len(word):
print ("anagram")
else:
print ("not anagram")
我认为它在 if len(anaw)
部分之后出了什么问题,例如,如果主要单词是 "hannah",而次要单词是 "hannnn",它认为它是一个变位词。
这里可以实现更简单的逻辑,即使不使用 sorted
等。假设您有一个函数 anagram
:
def anagram(word1, word2):
if len(word1) != len(word2):
return False
def char_count(word):
char_count = {}
for c in word:
char_count[c] = char_count.get(c, 0) + 1
return char_count
cr1 = char_count(word1)
cr2 = char_count(word2)
return cr1 == cr2
您可以使用以下方法进行测试:
>>> print(anagram("anagram", "aanragm"))
True
>>> print(anagram("anagram", "aangtfragm"))
False
对于未来的读者,一个超级简单的 pythonic 解决方案可能是使用 Counter
:
from collections import Counter
>>> Counter(word1) == Counter(word2)
或使用sorted
:
>>> sorted(word1) == sorted(word2)
newcounter = int(0)
这是导致问题的行(在 while 循环中)。
因此,您会再次从头开始检查单词。
我想你希望它是 newcounter=letterchecker
。
由于已经使用的字符被放在 word
的前面,如果您以 letterchecker
告诉我它是否有效
编辑:检查给出的示例,似乎有效。
[编辑这只是为了我无法阅读的回文]
这里有一些更简单的东西:
storedword = input("Enter your primary word \t")
word3 = input("Enter anagram word \t")
if storedword == word3[::-1]:
print "Is Anagram"
else:
print "Is not anagram"
如果不使用 sort
,您可以使用以下方法。它从第二个单词的字符数组中删除一个字母。如果没有剩余字母,则这些单词只是变位词(并且单词的开头长度相同且长度大于零):
word1="hannah"
word2="nahpan"
chars1= list(word1)
chars2= list(word2)
if len(chars1)==len(chars2) and len(chars1)>0:
for char in chars1:
if char not in chars2:
break
chars2.remove(char)
if len(chars2)==0:
print "Both words are anagrams"
else:
print "Words are not anagrams"