0

このリクエストが合法であることを願っています。私はエンジニア向けにPythonのプログラミングコースを受講しているので、このビジネスは少し新しいです。とにかく、私の宿題では、2つの文字列を受け取り、一方が他方の(順列/ Anagrm)であるかどうかを確認する関数を作成するように要求されました。(つまり、両方の文字がまったく同じで、各文字の出現回数が同じである場合)

iv'eは検索中にここでいくつかの優れたコードを見つけましたが、それでもコードの何が問題になっているのかわかりません(そして、勉強の過程で知っておくことが重要です)。

関数をチェックすることを想定したテストファイルを取得しましたが、そのエラーが発生しました。

Traceback (most recent call last):
File "C:\Users\Or\Desktop\תכנות\4\hw4\123456789_a4.py", line 110, in <module>
test_hw4()
File "C:\Users\Or\Desktop\תכנות\4\hw4\123456789_a4.py", line 97, in test_hw4
test(is_anagram('Tom Marvolo Riddle','I Am Lord Voldemort'), True)
File "C:\Users\Or\Desktop\תכנות\4\hw4\123456789_a4.py", line 31, in is_anagram
s2_list.sort()
NameError: global name 's2_list' is not defined

これは私のコードです:

def is_anagram(string1, string2):    

    string1 = string1.lower() #turns Capital letter to small ones
    string2 = string2.lower()
    string1 = string1.replace(" ","") #turns the words inside the string to one word
    string2 = string2.replace(" ","")

    if len(string1)!= len(string2):
        return False

    s1_list = [string1[i] for i in range(len(string1))] #creates a list of string 1 letters
    a2_list = [string1[k] for k in range(len(string1))]
    s1_list.sort()  #sorting the list
    s2_list.sort()
    booli=False
    k=0

    for i in s1_list: #for loop which compares each letter in the two lists
        if s1_list[k]==s2_list[k]:
            booli = True
            k=k+1
        else:
            booli=False
            break

    return booli

誰もがそれを修正する方法を知っていますか?

ありがとう!

4

3 に答える 3

5

とのタイプミスがあるようですa2_list。そのセクションは次のようになります。

s1_list = [string1[i] for i in range(len(string1))] #creates a list of string 1 letters
s2_list = [string2[k] for k in range(len(string2))]
s1_list.sort()  #sorting the list
s2_list.sort()

FWIW、これは、2 つの文字列が互いのアナグラムであるかどうかを確認する方法のインタラクティブなプロンプトの例です。

>>> string1 = 'Logarithm'
>>> string2 = 'algorithm'
>>> sorted(string1.lower()) == sorted(string2.lower()) # see if they are anagrams
True
于 2011-11-26T08:15:59.230 に答える
0

listify_string関数を作成し、それを使用してとを設定するs1_lists2_list、s1_listとs2_listの両方を同じ文字列から入力することを意図していない限り、コードに誤りがあるように見えることが複数あることがわかりやすくなります。

def listify(string):
    return [c for c in string]

次に、単純に実行して値を設定できs1_list = listify(string1)ますs2_list = ...

私はおそらく少なくとも「2つのリストが同じかどうかのチェック」を関数に変えるので、アーリーリターンを使用して偽を示すことができます(したがってbooli、trueとして開始する代わりに、ループの各反復で設定して中断しますfalseの場合はループから外れます)。

Python文字列のメソッドを見ると、joins1_listとs2_listが同じであるかどうかを確認する別の方法のインスピレーションが見つかるかもしれません。

于 2011-11-26T08:31:03.540 に答える
0

代わりに、このワンライナーを試してください。

sorted(s1.lower().replace(' ', '')) == sorted(s2.lower().replace(' ', ''))

Python 文字列は基本的にリストであるため、並べ替えることができます。最初に大文字と空白を処理するだけです。次に、python equals 演算子が実際の比較を処理します。

于 2011-11-26T09:27:55.817 に答える