2016-11-04 8 views
0

2つの単語がアナグラムであるかどうかをチェックする小さなプログラムを作成しました。 2つの単語がアナグラムの場合は "true"を返し、そうでない場合は "False"を返しますが、正しい出力が得られません。親切にも、以下のプログラムの間違いを教えてください。python 2つの単語がアナグラムであるかどうかを確認するプログラム

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

これをよりわかりやすい形式でフォーマットしてください。あなたが反復処理され

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

:あなたは任意の文字が各列に倍の同じ量を発生した場合、あなたの関数がreturn True

がこれをしようとすることを意味し、ループ内return Trueを呼び出しているようしかし、それが見えます単語を入力して何もしないでください(pass、空文)。その後、Trueを無条件に返信し、Falseを返す機会はありません。

代わりに、あなたは、単に二つの言葉を並べ替えた後、彼らは同じことを終わるかどうかを確認することができます

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

あなたは本当に接近していました。あなたのインデントは悪いですが、それはおそらくここのテキスト書式化のためです。

あなたのコードの間違いは、あなたが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

これはスティーブの答え(そして問題のアルゴリズム)と同じ問題を抱えています - 's2'が' s1'に文字がない場合でも 'True'を生成します。 'anagram( 'a'、 'ab')'を試してください。 – TigerhawkT3

+0

私はそれを行い、 'set(s1)-set(s2)'は空のセットではないので、期待通りにFalseを返します。 –

+0

本当ですか?本当に本当に好きですか? :) – TigerhawkT3

関連する問題