-2

文字列を取る関数を作ろうとしてpartial_alphabeticいます。

この関数は、文字列内の各文字を取得し、その i 番目の位置を見つけてpartial_alphabetic、既知のアルファベット (a、b、c など) で対応する文字を取得し、文字が不明な場合は "!" を出力する必要があります。その代わりに。

これが私のコードです:

def cipher_attack(partial_alphabetic,ciphertext):
    var = ""
    for i in xrange(len(ciphertext)):
        letter = ciphertext[i]
        for j in xrange(len(partial_alphabetic)):
            if(partial_alphabetic[j] == letter):
                c = partial_alphabetic.index(letter)
                var += alphabet[c%26]
        var += "!"                    
    print var


cipher_attack("!wertyuiopasdfghjklzxcvbnm","rqr")

印刷されますが、代わりにd!!d!印刷する必要があります。d!d

4

4 に答える 4

1

一致するものが見つかったらループから抜け出し、forループにelse:スイートを与えます。そのスイートは、ループが抜け出していない場合にのみ実行されます。

def cipher_attack(partial_alphabetic, ciphertext):
    var = ""
    for letter in ciphertext:
        for i, pa in enumerate(partial_alphabetic):
            if pa == letter:
                var += alphabet[i % 26]
                break
        else:
            var += "!"                    
    return var

最初にインデックスを作成する必要はなくciphertextpartial_alphabetic 直接ループできることに注意してください。ただし、インデックスがあると との照合に役立ちますalphabetが、さらにインデックスを作成すると、 の方が簡単enumerate()です。

デモ:

>>> import string
>>> alphabet = string.ascii_letters
>>> def cipher_attack(partial_alphabetic, ciphertext):
...     var = ""
...     for letter in ciphertext:
...         for i, pa in enumerate(partial_alphabetic):
...             if pa == letter:
...                 var += alphabet[i % 26]
...                 break
...         else:
...             var += "!"                    
...     return var
... 
>>> cipher_attack("!wertyuiopasdfghjklzxcvbnm", "rqr")
'd!d'
于 2013-10-05T17:02:50.597 に答える
0

またはstr.translateを使用します。

import string
def cipher_attack(partial_alphabetic, ciphertext):
    missing = ''.join(set(ciphertext).difference(partial_alphabetic))
    table = string.maketrans(
        partial_alphabetic+missing,
        string.letters[:len(partial_alphabetic)]+'!'*len(missing))
    return (ciphertext.translate(table))

print(cipher_attack('!wertyuiopasdfghjklzxcvbnm', 'rqr'))

版画

d!d

通常、str.translate文字列を 1 文字ずつループする同等のコードよりも高速に実行されます。あなたの例でciphertextは、短いのでほとんど問題になりませんが、長いテキストの場合は重要になる可能性があります。

cipher_attack2比較のためにループソリューションを使用する:

In [43]: %timeit cipher_attack('!wertyuiopasdfghjklzxcvbnm', 'rqr'*10000)
1000 loops, best of 3: 696 µs per loop

In [44]: %timeit cipher_attack2('!wertyuiopasdfghjklzxcvbnm', 'rqr'*10000)
10 loops, best of 3: 32 ms per loop

In [45]: 32000/696.
Out[45]: 45.97701149425287
于 2013-10-05T17:07:34.013 に答える
0

使用する:

def cipher_attack(partial_alphabetic,ciphertext):
    var = ""
    for c in chipertext:
        if c in partial_alphabetic: var+=c
        else: var+='!'
    return var

cipher_attack("!wertyuiopasdfghjklzxcvbnm","rqr")
于 2013-10-05T17:01:50.973 に答える
0

こんな感じで改善できます

def cipher_attack(partial_alphabetic,ciphertext):
    var = ""
    for i in xrange(len(ciphertext)):
        if ciphertext[i] in partial_alphabetic:
            var += alphabet[partial_alphabetic.index(ciphertext[i]) % 26]
        else:
            var += "!"
    print var

cipher_attack("!wertyuiopasdfghjklzxcvbnm","rqr")

出力

d!d
于 2013-10-05T17:03:20.170 に答える