web-dev-qa-db-ja.com

文字列を相互にチェックする(アナグラム)

割り当ては、ユーザーから単語の2つのグループを受け入れ、2つがアナグラムである場合(または少なくとも一方のすべての文字が他方に存在する場合)、「False」である「True」ステートメントを出力するプログラムを作成することです。ない場合はステートメント。

プログラミング全体としては非常に新しいので、文字列にインデックスを付けてすべての部分を別の部分と比較する以上の方法はわかりません。私は初心者であることを強調します。 PythonとAnagramでタグ付けされた他の多くの記事を読んだことがあり、それらは頭の上に均一にあり、私が教えていないことを参照しています。 -これまでの作業コード:

s1 = input("Please enter a Word:")
s2 = input("Please enter another Word:")

for i in range(0, len(s1), 1):
    if i in range (0, len(s2), 1):
        print("The letters in your first Word are present in your second Word.")
10
Kyle

条件付きロジックについてもう少し考える必要があります。ループは正しい軌道にありますが、s2にない文字がs1にある場合は、このループからbreakを出して、 "False"ステートメントを出力する必要があります。 all_s1_in_s2 = Trueのような変数の使用を検討し、一致しない文字を見つけたらfalseに設定します。

その他のヒント:

  • for l in s1は文字列s1をループし、lとして各文字に順番にアクセスできます-rangelenはまったく必要ありません

  • if .. inステートメントは、文字が文字列に存在するかどうかをテストするのに役立ちます。 if letter in mystring:は有効なステートメントであり、これはrangeまたはlenを必要とせずに、非常に役立ちます。

  • 可能な場合は、変数名に数字を使用しないでください。例として、Word_oneWord_twoのほうが適しています。

5
John Lyon

文字列を並べ替えるだけではどうですか?

>>> sorted('anagram')
['a', 'a', 'a', 'g', 'm', 'n', 'r']
>>> sorted('nagaram')
['a', 'a', 'a', 'g', 'm', 'n', 'r']
>>> sorted('anagram') == sorted('nagaram')
True
37
Blender

collectionsライブラリの魔法 Counter を使用できます。ドキュメントから:

これは、要素が辞書キーとして格納され、それらの数が辞書値として格納される、順序付けされていないコレクションです。

したがって、文字列(反復可能)を使用してCounterオブジェクトを初期化し、文字列から別のCounterと比較できます

from collections import Counter

def is_anagram(str1, str2):
   return Counter(str1) == Counter(str2)
15
lborgav
def is_anagram(w1, w2):
    w1, w2 = list(w1.upper()), list(w2.upper())
    w2.sort()
    w1.sort()
    return w1 == w2
2
Gaurav Nagpure

辞書を使用して2つの文字列がお互いのアナグラムであるかどうかを確認するには:注:偶数、特殊文字を入力として使用できます

def anagram(s):
    string_list = []
    for ch in s.lower():
        string_list.append(ch)

    string_dict = {}
    for ch in string_list:
        if ch not in string_dict:
            string_dict[ch] = 1
        else:
            string_dict[ch] = string_dict[ch] + 1

    return string_dict



s1 = "master"
s2 = "stream"

a = anagram(s1)
b = anagram(s2)

if a == b:
    print "Anagram"
else:
    print "Not Anagram"
1
kumar22
>>> s1 = 'vivid'
>>> s2 = 'dvivi'
>>> s3 = 'vivid'
>>> def is_anagram(s1, s2):
...     if s1.lower() == s2.lower():
...         return False
...     return sorted(s1.lower()) == sorted(s2.lower())
...
>>> is_anagram(s1, s2)
True
>>> is_anagram(s1, s3)
False
>>> s2 = 'dvivii'
>>> is_anagram(s1, s2)
False
>>> s2 = 'evivi'
>>> is_anagram(s1, s2)
False
>>> 
1
Shan Valleru

次のコードを使用すると、特殊文字も数もカウントされず、両方の文字列で合計文字数が等しく発生した場合に「アナグラムです」が返され、文字列がアナグラムかどうかがわかります。

text = input('Enter a string: ')
text1 = input('Enter a string: ')
text,text1 = text.lower(),text1.lower()
count = 0
count1=0
for i in range(97,123):
    if chr(i) in text and chr(i) in text1:
    count1+=1
        if text.count(chr(i)) == text1.count(chr(i)):
             count +=1
if len(text) >= len(text1):
    num1 = len(text)
else:
    num1 = len(text1)
if count == count1:
    print("they are anagrams")
else :
    print("they are not anagrams")
1

これでこうなると思います


s1 = "listen"
s2 = "silent"
s1=list(s1);s1.sort()
s2 = list(s2);s2.sort()
if s1 == s2:
   print ("Given Strings are Anagram")
else:
   print ("Given String are not anagrams")

0
Nagesj Jayaram

最も簡単な最短のソリューション

def anagram(Word1, Word2):
    return sorted(Word1) == sorted(Word2)

小切手

print(anagram("xyz","zyx"))
>>True

print(anagram("xyz","zyy"))
>>False
0
Later_72
    #An anagram is the result of rearranging the letters of a Word to produce a new Word. Anagrams are case insensitive
    #Examples:
    # foefet is an anagram of toffee
    # Buckethead is an anagram of DeathCubeK

    # The shortest my function style *************************************** 
    def is_anagram1(test, original):
        """Сhecks 'test' is anagram of 'original' strings based on:
        1. length of the both string and length of the sets made from the strings is equivalent
        2. then checks equivalents of sorted lists created from test and original strings

        >>> is_anagram1('Same','same')
        False
        >>> is_anagram1('toffee','foeftt')
        False
        >>> is_anagram1('foefet','toffee')
        True
        >>> is_anagram1("Buuckk",'kkkcuB')
        False
        >>> is_anagram1('Buckethead','DeathCubeK')
        True
        >>> is_anagram1('DeathCubeK','Buckethead')
        True
        """
        # check the length of the both string
        if len(test) != len(original):
            return False

        # check is the strings are the same
        t,o = test.lower(), original.lower()
        if t == o:
            return False

        # check the sorted lists
        return sorted(t) == sorted(o)


    # The final my one line code **************************************
    def is_anagram(test, original):
        """Сhecks 'test' is anagram of 'original' in one line of code

        >>> is_anagram('Same','same')
        False
        >>> is_anagram('toffee','foeftt')
        False
        >>> is_anagram('foefet','toffee')
        True
        >>> is_anagram("Buuckk",'kkkcuB')
        False
        >>> is_anagram('Buckethead','DeathCubeK')
        True
        >>> is_anagram('DeathCubeK','Buckethead')
        True
        """
        return False if len(test) != len(original) or test.lower() == original.lower() else sorted(test.lower()) == sorted(original.lower())

    if __name__ == "__main__":
        import doctest
        doctest.testmod(verbose=True)


### 2 items passed all tests:
### 6 tests in __main__.is_anagram
### 6 tests in __main__.is_anagram1
### 12 tests in 3 items.
### 12 passed and 0 failed.
### Test passed
0
АСTPOHOMOC

以下は、典型的な割り当てソリューションの1つです。

def anagram(s1, s2):
""" (str, str) -> bool

Return True if s1 and s2 are anagrams

>>> anagram(s1, s2)
True
"""
    s1 = s1.replace(" ", "")
    s2 = s2.replace(" ", "")

    s1_new = list(s1)
    s2_new = list(s2)

    if len(s1_new) == len(s2_new):
        dupe_found = True
        while dupe_found:
            dupe_found = False
            for i in s1_new:
                for j in s2_new:
                    if i == j:
                        s1_new.remove(i)
                        s2_new.remove(j)
                        dupe_found = True
                        break
                break
    return s1_new == s2_new
0

ちょっとした考え:

def check_(arg):
        mark = hash(str(set(sorted(arg))))
        return mark

def ana(s1, s2):
        if check_(s1) != check_(s2):
                pass
        Elif len(s1) != len(s2):
                pass
        else:
             print("{0} could be anagram of  {1}".format(s1, s2))
0
Schopenhauer

この場合、ソートされた文字列ごとに2つのコンテナーを使用してチェックします。

def anagram(s1, s2):
    str1 = ''
    str2 = ''

    for i in s1:
      str1 += i

    for j in s2:
      str2 += j

    if str1 == str2:
      return True

    return False
0
Israel Manzo

私は最短の方法ができると思います:

fstr=input("enter first string:")
sstr=input("enter second string:")

if(fstr==sstr[::-1]):
    print("it's anagram")
0
Amrit

これは私のために働いた

str1="abcd"
str2="bcad"
Word1=[]
Word2=[]
for x in range(len(str1)):
    Word1.append(str1[x])
for x in range(len(str2)):
    Word2.append(str2[x])
if(len(Word1)==len(Word2)):
    for letter in Word1:
        if letter in Word2:
            Word2.remove(letter)

if len(Word2)==0:
    print "anagram"
else:
    print "not anagram"
0

Python辞書を使用することに固執し、関数型プログラミングを使用できない場合の解決策は次のとおりです。

内包表記を使用して辞書を作成し、2つのWordの辞書を単純な==演算子と比較します。

def isanagram2(wrd1, wrd2):

    wrd1_dict = {k: 0 for k in wrd1}
    wrd2_dict = {k: 0 for k in wrd2}

    for c1, c2 in Zip(wrd1, wrd2):
        wrd1_dict[c1] += 1
        wrd2_dict[c2] += 1

    if wrd1_dict == wrd2_dict:
        return True
    return False
0
daniel lee