13

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

プログラミング全体に非常に慣れていないので、文字列にインデックスを付けて、すべての部分を別の部分と比較するだけではどうすればよいかわかりません。私は初心者であることを強調します。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.")
4

26 に答える 26

43

文字列をソートしないのはなぜですか?

>>> sorted('anagram')
['a', 'a', 'a', 'g', 'm', 'n', 'r']
>>> sorted('nagaram')
['a', 'a', 'a', 'g', 'm', 'n', 'r']
>>> sorted('anagram') == sorted('nagaram')
True
于 2013-02-20T22:12:18.200 に答える
5

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

その他のヒント:

  • for l in s1文字列 s1 をループして、順番に各文字にアクセスできるようにしますl-必要ないrange、またはlenまったくない

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

  • 可能であれば、変数名に数字を使用することは避けてください。たとえば、word_oneandの方がよいでしょう。word_two

于 2013-02-20T22:07:06.687 に答える
2
def is_anagram(w1, w2):
    w1, w2 = list(w1.upper()), list(w2.upper())
    w2.sort()
    w1.sort()
    return w1 == w2
于 2016-10-20T06:20:30.763 に答える
2

辞書を使用して 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"
于 2016-01-07T04:47:53.633 に答える
1

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

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")
于 2017-12-03T08:23:08.360 に答える
0

    #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
于 2016-05-31T22:40:26.643 に答える
0

これは私のために働いた

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"
于 2015-04-04T17:12:02.083 に答える
0

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

def anagram(word1, word2):
    return sorted(word1) == sorted(word2)

小切手

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

print(anagram("xyz","zyy"))
>>False
于 2018-12-06T21:07:11.510 に答える
0

典型的な割り当てソリューションの 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
于 2019-06-08T08:15:04.777 に答える
-1

アナグラムは、同じ文字で形成された 2 つの異なる単語です。たとえば、EAT と TEA には、同様に多数の例があります。

与えられた 2 つの単語または文がアナグラムであるかどうかを確認する 1 つの良い方法は、サイズ 256 のカウンター配列を設定し、最初にすべての値を 0 に設定することです。 words) 次に、最初の文字列 (単語または文) の読み取りを開始し、配列内の対応する ASCII 位置を 1 つ増やします。完全な文字列に対してこれを繰り返します。次に、2 番目の文字列の読み取りを開始し、配列内の各文字に対応する ASCII カウンターを減らし続けます。最後に、配列を解析します。すべての値がゼロの場合、入力はアナグラムであり、それ以外の場合はそうではありません。以下は、理解を深めるためのコメント付きのコードです。

#include<iostream>
#include<string>

using namespace std;

bool is_anagram(string s1, string s2)
{
    //Following statement chechs the base condition; if either of the strings is empty,                                  
    //return False
    if(s1.length() == 0 || s2.length() == 0)
        return false;

    //initializing the counter array and setting it's values to 0
    int counter[256] = {0};

    //Calculating the lengths of both the strings
    int len1 = s1.length();
    int len2 = s2.length();

    //Following is also a base condition that checks whether the strings are equal in 
    //length, if not we return False
    if(len1 != len2)
        return false;

    //Following for loop increments the values of the counter array for the first  
    //string
    for(int i = 0; i < len1; i++)
    {
        counter[s1[i]]++;
    }

    //This for loop decrements the values of the counter array for the second string
    for(int i = 0; i < len2; i--)
    {
        counter[s2[i]]--;
    }
    //Now we check whether the counter array is empty/(or as it was initialized); if               
    //yes then the two strings are anagrams
    for(int i = 0; i < 256; i++)
    {
        if(counter[i] != 0)
            return false;
    }

    return true;
}
于 2013-05-14T22:25:04.657 に答える
-2

並べ替えを使用しない別のソリューション:

s1 = "aaabbbccc"
s2 = "abcabcabc"

def are_anagram1(s1, s2):
   return [False, True][sum([ord(x) for x in s1]) == sum([ord(x) for x in s2])]

print are_anagram1(s1,s2)

注意:これは数字ではなくアルファベットでのみ機能します

于 2014-01-12T06:39:19.217 に答える
-2

解決:

print('Strings are anagrams' if sorted(input("Enter 1st string: "))== sorted(input("Enter 2nd string: ")) else 'Strings are not anagrams')
于 2021-08-17T09:41:37.903 に答える
-2
def areAnagram(s1,s2):
    if len(s1) != len(s2):
        return False
    count = [0]*256
    for i in range(len(s1)):
        count[ord(s1[i])] += 1
        count[ord(s2[i])] -= 1
                       
    for x in count:
        if x != 0: 
            return False
    return True

a = input("Enter a string:")
b = input("Enter b string: ")

print(areAnagram(a,b))
于 2021-06-23T11:57:41.847 に答える