0
    alphabet =["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
def decoder(input):
    inputlist = list(input)
    inputlength = len(input)
    alphabetlength = len(alphabet)
    result = "Decoded Sentence: "
    for x in range(inputlength):
        for y in range(alphabetlength):
            if inputlist[x] is alphabet[y]:
                print ("hi")
                if y == 24:
                    result += "a"
                if y == 25:
                    result += "b"
                else:
                    result += alphabet[y+2]
            if inputlist[x] is "(":
                result += "("
            if inputlist[x] is ")":
                result += ")"
            if inputlist[x] is ".":
                result += "."
            if inputlist[x] is " ":
                result += " "
    return result

私のコードは、文のアルファベットを 2 ずつインクリメントすることになっています。例: a->c, l->n if ステートメントが真であると評価されたかどうかを確認するために print("hi") ステートメントを配置しましたが、決してそうではありません。 . 誰かが理由を教えてもらえますか?

4

4 に答える 4

5

isオブジェクトIDをチェックします。2 つの文字列が同じ値を持っている (同じobjectではない) かどうかをテストしているように見えるので、==. 例えば:

if inputlist[x] == alphabet[y]

if他のステートメントについても同じ更新を行うことができます。

于 2013-11-04T20:38:25.717 に答える
4

問題はis、文字列の同一性ではなく同一性を比較することです。等しい 2 つの短い文字列は、CPython が実行する一部の文字列インターンにより同一である可能性がありますが、通常、この動作に基づいて構築するべきではありません。代わりに、文字列の等価性==を比較するために使用します。

str.translateによって作成されたマップを使用して、これをよりうまく行うことができることに注意してくださいstr.maketrans

>>> table = str.maketrans('abcdefghijklmopqrstuvwxyz', 'cdefghijklmopqrstuvwxyzab')
>>> 'hello world'.translate(table)
'jgooq yqtof'

さらに使用できるstring.ascii_lowercaseので、自分でアルファベットを入力する必要はありません。またはstring.ascii_letters大文字と小文字に使用します。

>>> table = str.maketrans(string.ascii_letters, string.ascii_letters[2:] + string.ascii_letters[:2])
>>> 'Hello World (This works!)'.translate(table)
'Jgnnq Yqtnf (Vjku yqtmu!)'
于 2013-11-04T20:41:12.587 に答える
1

薄いことに加えisて、コードに別の問題があります。

とすぐy == 24に壊れます: 最初にaが追加され、次にalphabet[26]- がエラーになります。

したがって、ロジックを次のように変更します

for inp in inputlist:
    if inp in "(). ":
        result += inp
    else: # very important
        for y in range(alphabetlength):
            if inp == alphabet[y]:
                if y == 24:
                    result += "a"
                elif y == 25: # elif instead of if!
                    result += "b"
                else:
                    result += alphabet[y+2]

これはさらに改善できます。

あなたが作るならalphabet = 'abcdefghijklmnopqrstuvwxyz'、あなたはできる

for inp in inputlist:
    if inp in "(). ":
        result += inp
    else: # very important
        idx = alphabet.find(inp)
        if idx >= 0: # found
            result += alphabet[(idx + 2) % len(alphabet)]
于 2013-11-04T20:49:53.560 に答える
0

これは、「is」キーワードをクリアするのに役立つ場合があります。「is」は、値ではなく、オブジェクトの ID をチェックします。

var_1 = ('a', 'b')
var_2 = ('a', 'b') # same content, but different object
var_3 = var_1 # same object
n = lambda v: ' ' if v else ' not '
print('{0} has{2}the same value as {1}'.format('var_1', 'var_2', n(var_1 == var_2)))
print('{0} has{2}the same value as {1}'.format('var_2', 'var_3', n(var_2 == var_3)))
print('{0} has{2}the same value as {1}'.format('var_3', 'var_1', n(var_3 == var_1)))
print('{0} is{2}the same object as {1}'.format('var_1', 'var_2', n(var_1 is var_2)))
print('{0} is{2}the same object as {1}'.format('var_2', 'var_3', n(var_2 is var_3)))
print('{0} is{2}the same object as {1}'.format('var_3', 'var_1', n(var_3 is var_1)))

出力:

var_1 has the same value as var_2
var_2 has the same value as var_3
var_3 has the same value as var_1
var_1 is not the same object as var_2
var_2 is not the same object as var_3
var_3 is the same object as var_1

したがって、3 つの値はすべて同じですが、1 と 3 だけが同じです。

于 2013-11-04T20:45:14.597 に答える