我正在进行一项练习,要求编写一个为给定消息创建列密码的函数。我想进一步扩展它,让这个列cypher适用于所有长度的消息。对于那些不知道列密码的人会这样工作。
说我的信息是“这是一个测试周期”。我们指定每行的长度为5.现在,每个字符串可能没有所需的长度可以被我们的特定行长度完全整除,因此我们用“X”填充消息。然后该消息将如此:
THISI
SATES
TCYPH
ERXXX
将发送的消息如下所示“TSTEHACRITYXSEPXISHX”
这是我到目前为止所做的,首先是一个准备使用消息的函数:
def prep_msg(message, row_length):
message = message.upper().replace(' ', '')
num_xs = len(message) % row_length
message += 'X' * (row_length - num_xs)
return message
接下来,我想创建一个字典,其中每列都是键,值是与该列关联的字母。在这一步之后,我可以继续处理我的消息。但是,我坚持这一步,因为我看到的输出似乎是完全空的。我的第二个函数看起来像这样:
def column_dict(message, row_length):
message = prep_msg(message, 3)
num_cols = range(row_length)
column_dict = {}
for x in range(len(message)):
for i in num_cols:
if x % row_length == i:
column_dict['column_{0}'.format(i)] = [].append(message[x])
return column_dict
我使用的邮件是message = "This message is very secret"
以下是我的功能输出:
prep_msg(message, 3)
>> 'THISMESSAGEISVERYSECRETX'
column_cypher(message, 3)
>> {'column_0': None, 'column_1': None, 'column_2': None}
有人能指出我正确的方向,为什么我的第二个功能不起作用?谢谢!
答案 0 :(得分:1)
追加将参数添加到给定列表中,但修改就位。返回值为无,它将进入您的字典。更改语句以在右侧有更好的表达,例如 [message [x]] ...已修改以累积字母。
更好的是,请注意您的词典更像是一个列表(即数组)。将基本结构转换为字符串列表可能会做得更好:
["THISI", "SATES", "TCYPH", "ERXXX"]
这里的索引比构造“column_ {0}”要简洁得多。 然后使用简单的列表推导来构建列主要字符串。
这足以让你感动吗?
答案 1 :(得分:1)
所以我最终改变了@Prune的功能结构。以下是它最终为那些对未来感兴趣并且偶然发现这个问题的人的工作方式。
def prep_msg(message, row_length):
message = message.upper().replace(' ', '')
num_xs = len(message) % row_length
message += 'X' * (row_length - num_xs)
return message
def encode_column(message, rows):
prep_msg(message, row_length)
col_list = [message[i::row_length] for i in range(row_length)]
encoded_message = ''.join(col_list)