8

私はコードを書いているので、テキストをアルファベットに沿って 2 桁ずらすことができます:「ab cd」は「cd ef」になるはずです。私はPython 2を使用していますが、これは私がこれまでに得たものです:

def shifttext(shift):
    input=raw_input('Input text here: ')
    data = list(input)
    for i in data:
        data[i] = chr((ord(i) + shift) % 26)
        output = ''.join(data)
    return output
shifttext(3)

次のエラーが表示されます。

File "level1.py", line 9, in <module>
    shifttext(3)
File "level1.py", line 5, in shifttext
    data[i] = chr((ord(i) + shift) % 26)
TypError: list indices must be integers, not str

それで、どういうわけか文字を数字に変更する必要がありますか?しかし、私はすでにそれをやったと思いましたか?

4

5 に答える 5

10

文字のリストをループしてiいるため、文字です。次に、文字をインデックスとしてdata使用して、それを格納しようとします。iそれはうまくいきません。

enumerate()インデックス値を取得するために使用します。

def shifttext(shift):
    input=raw_input('Input text here: ')
    data = list(input)
    for i, char in enumerate(data):
        data[i] = chr((ord(char) + shift) % 26)
    output = ''.join(data)
    return output

ジェネレーター式を使用してこれを単純化できます。

def shifttext(shift):
    input=raw_input('Input text here: ')
    return ''.join(chr((ord(char) + shift) % 26) for char in input)

しかし、今ではうまくいかないことに気付くでしょう% 26。ASCII コードポイントは 26 の後に始まります。

>>> ord('a')
97

ord('a')代わりにモジュラスを使用できるようにするには、値を使用する必要があります。減算すると、値が 0 ~ 25 の範囲になり、後で再度加算します。

    a = ord('a')
    return ''.join(chr((ord(char) - a + shift) % 26) + a) for char in input)

ただし、それは小文字に対してのみ機能します。これで問題ないかもしれませんが、入力を小文字にすることで強制できます。

    a = ord('a')
    return ''.join(chr((ord(char) - a + shift) % 26 + a) for char in input.lower())

次に、関数からの入力を要求して、1 つの仕事をうまく行うことに集中させると、次のようになります。

def shifttext(text, shift):
    a = ord('a')
    return ''.join(chr((ord(char) - a + shift) % 26 + a) for char in text.lower())

print shifttext(raw_input('Input text here: '), 3)

これをインタラクティブプロンプトで使用すると、次のようになります。

>>> print shifttext(raw_input('Input text here: '), 3)
Input text here: Cesarsalad!
fhvduvdodgr

もちろん、今では句読点も一緒に使われています。最後の改訂、現在は文字をシフトするだけです:

def shifttext(text, shift):
    a = ord('a')
    return ''.join(
        chr((ord(char) - a + shift) % 26 + a) if 'a' <= char <= 'z' else char
        for char in text.lower())

そして、次のようになります。

>>> print shifttext(raw_input('Input text here: '), 3)
Input text here: Ceasarsalad!
fhdvduvdodg!
于 2013-01-20T12:37:00.970 に答える
9

シーザー暗号暗号化を行っているように見えるので、次のように試すことができます。

strs = 'abcdefghijklmnopqrstuvwxyz'      #use a string like this, instead of ord() 
def shifttext(shift):
    inp = raw_input('Input text here: ')
    data = []
    for i in inp:                     #iterate over the text not some list
        if i.strip() and i in strs:                 # if the char is not a space ""  
            data.append(strs[(strs.index(i) + shift) % 26])    
        else:
            data.append(i)           #if space the simply append it to data
    output = ''.join(data)
    return output

出力:

In [2]: shifttext(3)
Input text here: how are you?
Out[2]: 'krz duh brx?'

In [3]: shifttext(3)
Input text here: Fine.
Out[3]: 'Flqh.'

strs[(strs.index(i) + shift) % 26]:上の行は、の文字​​のインデックスを見つけて、iそれにstrsシフト値を追加することを意味します。最後の値(インデックス+シフト)で、シフトされたインデックスを取得するために%26を適用します。このシフトされたインデックスが渡されるstrs[new_index] と、目的のシフトされた文字が生成されます。

于 2013-01-20T12:45:53.453 に答える
2

Martijnの答えは素晴らしいです。同じことを達成する別の方法を次に示します。

import string

def shifttext(text, shift):
    shift %= 26 # optional, allows for |shift| > 26 
    alphabet = string.lowercase # 'abcdefghijklmnopqrstuvwxyz' (note: for Python 3, use string.ascii_lowercase instead)
    shifted_alphabet = alphabet[shift:] + alphabet[:shift]
    return string.translate(text, string.maketrans(alphabet, shifted_alphabet))

print shifttext(raw_input('Input text here: '), 3)
于 2015-05-30T08:50:32.960 に答える
1

ストレート関数を書く方が簡単ですshifttext(text, shift)。プロンプトが必要な場合は、Python の対話モードを使用してくださいpython -i shift.py

> shifttext('hello', 2)
'jgnnq'
于 2013-01-20T12:34:17.000 に答える
1

Basic pythonで試してみました。誰かに役立つかもしれません。

# Caesar cipher
import sys

text = input("Enter your message: ")

cipher = ''
try:
  number = int(input("Enter Number to shift the value : "))
except ValueError:
  print("Entered number should be integer. please re0enter the value")
  try:
    number = int(input("Enter Number to shift the value : "))
  except:
    print("Error occurred. please try again.")
    sys.exit(2)
  
for char in text:
    if not char.isalpha():
      flag = char
    elif char.isupper():
      code = ord(char) + number
      if 64 < code <= 90:
        flag = chr(code)
      elif code > 90:
        flag = chr((code - 90) + 64)
        
    elif char.islower():
      code = ord(char) + number
      if 96 < code <= 122:
        flag = chr(code)
      elif code > 122:
        flag = chr((code - 122) + 96)
    
    else:
      print("not supported value by ASCII")
    
    cipher += flag

print(cipher)
于 2020-10-04T22:23:56.110 に答える