1

所以,我需要输入一个加扰的字母表,然后使用那个字母表输入一个秘密信息。我的程序需要解读秘密信息。到目前为止我已经写了这个并且被卡住了。我希望有人能帮助我。到目前为止,我尝试将列表中的每个索引都更改为 AZ。我的问题是如何使用我为此编写的内容并使其也适用于我输入的秘密信息。

s = ()

alphabet = input("Please input the scrambled alphabet in order: ")
message = input("Now input the scrambled message: ")
alphabet.upper()
s = dict(alphabet)
num = 1

while num < 2:
    s[0] = chr(65)
    s[1] = chr(66)
    s[2] = chr(67)
    s[3] = chr(68)
    s[4] = chr(69)
    s[5] = chr(70)
    s[6] = chr(71)
    s[7] = chr(72)
    s[8] = chr(73)
    s[9] = chr(74)
    s[10] = chr(75)
    s[11] = chr(76)
    s[12] = chr(77)
    s[13] = chr(78)
    s[14] = chr(79)
    s[15] = chr(80)
    s[16] = chr(81)
    s[17] = chr(82)
    s[18] = chr(83)
    s[19] = chr(84)
    s[20] = chr(85)
    s[21] = chr(86)
    s[22] = chr(87)
    s[23] = chr(88)
    s[24] = chr(89)
    s[25] = chr(90)
    num +=1
print (s)

for alpha in message.upper():
    if alpha < "A" or alpha > "Z":
        print(alpha,end="")
    else:
        print(s [ord(alpha) -65 ], end="")
4

6 回答 6

4

s首先,完全没有必要创建大字典。它实际上什么都不做:行:

s [ord(alpha) -65 ]

将一个字母变成一个数字,减去 65,然后将其放入字典中,将其加 65 再将其变回一个数字。

其次,该行alphabet.upper()实际上并没有改变字母表,它只是返回一个大写版本。你需要做

alphabet = alphabet.upper()

现在是肉的部分。您要做的是创建一个字典,将代码字母表中的字母映射到真实字母表中的字母。该行dict(alphabet)不这样做。相反,遍历字符串中的字符并将每个字符分配给相应的字母。您在使用 时走在正确的轨道上chr,但要做的工作太多了。这个怎么样:

s = {}
for i in range(26):  # iterate from 0 to 25
    s[alphabet[i]] = chr(65 + i)

因为chr(65 + i)是正常有序字母表中的字母,并且alphabet[i]是加扰的字母。

一旦你有了那本字典,逐个字母地浏览并更改它应该很容易(它留给你)。

于 2012-08-10T22:01:32.920 回答
2

您可以使用字符串translate()方法:

import string

intab   = 'abcdefghijklmnopqrstuvwxyz' # or string.ascii_lowercase
outtab  = 'xyzabcdefghijklmnopqrstuvw'
tab = string.maketrans(intab, outtab)
s = raw_input('Type some text: ').lower()
print s.translate(tab)

maketrans()创建一个包含两个字母的表,并将translate()字符串的每个字符替换为表中的对。

于 2012-08-10T22:10:43.830 回答
0

我不知道 Python - 这是伪代码

  1. 创建加扰字母数组
  2. 创建“正常”字母数组
  3. foreach char in message,在乱码数组中找到char,然后输出对应的“正常”char
于 2012-08-10T21:53:14.913 回答
0

你可以制作一本字典:

alphabet({'a':'alpha', 'b':'bravo','c':'charlie', etc.}) 

所以 abc 会翻译成 alphabravocharlie

其中 'a','b',.. 是编码字母,'alpha','bravo',... 是它们的实际值。通过反转这个来制作“密码”。

请参阅字典在线教程部分:http: //docs.python.org/dev/library/collections.html

于 2012-08-10T22:08:17.920 回答
0

我相信你在问'如果我输入一个字符串(我假设一个没有分隔符的字符串),我怎样才能让它成为一个字典,其中第一个字母 = A,第二个 = B,等等。(对不起,如果这是不正确的解释)。如果是这种情况,您可以执行以下操作(注意raw_input-的用法input是评估参数的内置函数 - 它不会分配):

alphabet = raw_input("Please input the scrambled alphabet in order: ")
message = raw_input("Now input the scrambled message: ")

secret_map = {}

# Step through the provided string, incrementing the character number by index.
# Index will start at 65 + 0 = A (change to 98 if you want lowercase)
for index, letter in enumerate(alphabet):
    secret_map[letter] = chr(65 + index)

# Now join the string together, mapping each letter to its corresponding value
new_str = ''.join([secret_map[char] for char in message])

# Print the resulting string
print new_str

由于这是家庭作业(也许你还没有列出理解),这相当于创建new_str

new_str = ''
for letter in message:
    new_str += secret_map[letter]

如果这不是您要找的,请告诉我。

于 2012-08-10T22:22:48.900 回答
0

我无法抗拒扩展 stummjr 的答案,以创建一个更 Python 的编码和解码版本(我添加了一些额外的变量来尝试让每个步骤更清晰):

import random, string

cypher_list = list(string.ascii_lowercase)
random.shuffle(cypher_list)
cypher_text = ''.join(cypher_list)

encode_tab = string.maketrans(string.ascii_lowercase, cypher_text)
decode_tab = string.maketrans(cypher_text, string.ascii_lowercase)

orig_text = 'this means war'
crypt_text = orig_text.translate(encode_tab)
clear_text = crypt_text.translate(decode_tab)

print cypher_text
print crypt_text
print clear_text
assert(clear_text == orig_text)
于 2012-08-11T19:58:15.063 回答