2016-11-04 30 views
0

我寫了一個小程序來檢查兩個單詞是否是anagrams。如果兩個單詞是anagrams,它應該返回「true」,否則它應該返回「False」,但我沒有得到正確的輸出。請告訴我下面的程序中有什麼錯誤。python程序來檢查兩個單詞是否爲anagrams

def anagram(s1,s2): 
    for x in s1: 
     if (x in s2) and (s2.count(x)==s1.count(x)): 
      pass 
     return(True) 
    else: 
     return(False) 
+3

你似乎在混合標籤和空格縮進 - 這是一個[壞主意](https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces) – jonrsharpe

回答

0

請以更易讀的方式對其進行格式化。然而,它看起來像您呼叫return True循環內,也就是說,如果任何字符出現的次數相同數量的每個字符串,你的函數將return True

試試這個:

def anagram(s1,s2): 
    for x in s1: 
     if (x in s2) and (s2.count(x) == s1.count(x)): 
      pass 
     else: 
      return False 
    for x in s2: 
     if (x in s1) and (s1.count(x) == s2.count(x)): 
      pass 
     else: 
      return False 
    return True 
+1

請注意,這仍然不會產生準確的結果,當一個字母在's2'而不是's1'中時。 – TigerhawkT3

+0

好的。更新我的回答來解釋這一點。 –

4

你迭代一個字,然後不做任何事情(與pass,空聲明)。然後無條件退貨True,不會退貨False

相反,你可以簡單地將兩個詞進行排序,然後看看他們最終是相同的:

def anagram(s1, s2): 
    return sorted(s1) == sorted(s2) 
-1

你是非常接近。您的縮進很糟糕,但這可能是由於SO中的文本格式所致。

您的代碼中的錯誤是您過早返回True。你必須做的是通過所有信件並檢查存在和計數。在下面你可以找到一個你正在嘗試做的更正和稍微優化的版本。

def anagram(s1, s2): 
    if set(s1) == set(s2) and all(s2.count(x) == s1.count(x) for x in set(s1)): 
     return True 
    return False 

但是再次@ Tigerhawk的解決方案是更好的。

+0

這與Steve的回答(以及問題中的算法)具有相同的問題 - 即使當s2中的字符不存在於s1中時,它也會生成True。試試'anagram('a','ab')'。 – TigerhawkT3

+0

我做了,並且它返回False,因爲'set(s1) - set(s2)'不是一個空集。 –

+0

你確定嗎?像,真的很積極? :) – TigerhawkT3

相關問題