2

文字だけを印刷したいのですが、ASCIIの特殊文字を印刷しています。私のコード:

import string
def caesar(shift):
    alphabet = string.ascii_lowercase + string.ascii_uppercase
    dict={}
    emptylist=[]
    int(shift)
    for x in alphabet:
        emptylist.append(x)
        code = ""
        for letters in emptylist:
            code = chr(ord(letters) + shift)
            dict[letters]=code
    return dict
caesar(12)

私の出力:

'm': 'y', 'l': 'x', 'o': '{', 'n': 'z', 'q': '}', 'p': '|', 's ': '\x7f', 'r': '~', 'u': '\x81', 't': '\x80', 'w': '\x83', 'v': '\x82' , 'y': '\x85', 'x': '\x84', 'z': '\x86'

正しい出力:

'm': 'y', 'l': 'x', 'o': 'a', 'n': 'z', 'q': 'c', 'p': 'b', 's ': 'e', 'r': 'd', 'u': 'g', 't': 'f', 'w': 'i', 'v': 'h', 'y': 'k', 'x': 'j', 'z': 'l'

4

2 に答える 2

5

文字コードを使用ord()および変更しても、結果の文字が辞書に制限されることはありません。

辞書で文字のインデックスを見つけてシフトし、モジュロ演算子を使用するだけです。

import string

def caesar(shift):
    alphabet = string.ascii_uppercase  # <- Change it back to what you had before
                                       #    and see what will happen.
    mapping = {}

    for letter in alphabet:
        index = alphabet.index(letter)
        mapping[letter] = alphabet[(index + shift) % len(alphabet)]

    return mapping

テスト (辞書は順序を保持しないため、かなり読みにくいです):

>>> caesar(12)
{'A': 'M', 'C': 'O', 'B': 'N', 'E': 'Q', 'D': 'P', 'G': 'S', 'F': 'R', 'I': 'U', 'H': 'T', 'K': 'W', 'J': 'V', 'M': 'Y', 'L': 'X', 'O': 'A', 'N': 'Z', 'Q': 'C', 'P': 'B', 'S': 'E', 'R': 'D', 'U': 'G', 'T': 'F', 'W': 'I', 'V': 'H', 'Y': 'K', 'X': 'J', 'Z': 'L'}
于 2012-10-31T02:52:42.697 に答える
5

特に 1 つのエラーを見てみましょうo: '{'

ord('o')は 111 であることに注意してchrくださいrange(111,130)

から始まり、o12 ずつシフトすると、次の{文字に移動します。

In [75]: ' '.join([chr(x) for x in range(111,130)])
Out[75]: 'o p q r s t u v w x y z { | } ~ \x7f \x80 \x81'
          ^ 1 2 3 4 5 6 7 8 9 ...12

したがって、間違った出力が得られる理由は、式が原因です

code = chr(ord(letters) + shift)

a-zは、シフトによってまたはに関連付けられたオードから外れた場合に何が起こるかを考慮していませんA-Z。( ord の範囲はa-zA-Z連続していないことに注意してください!)


修正方法のヒントは次のとおりです。

In [82]: alphabet = string.ascii_lowercase + string.ascii_uppercase

In [83]: alphabet.index('o')
Out[83]: 14

In [84]: alphabet[alphabet.index('o')+12]
Out[84]: 'A'

しかし

In [85]: alphabet[alphabet.index('O')+12]

になりますIndexError: string index out of range。それlen(alphabet)は 52 であり、

In [91]: alphabet.index('O')+12
Out[91]: 52

どういうわけか、0 に戻すには 52 が必要です。%モジュロ演算子でそれを行うことができます。

In [92]: 52 % 52
Out[92]: 0
于 2012-10-31T02:55:41.957 に答える