Python Atbash密码

时间:2017-08-16 15:15:49

标签: python cypher

我正在尝试实现并z转换为def answer(s): a_z = map(chr, range(ord('a'), ord('z')+1)) z_a = sorted(a_z, reverse=True) list(s) #trasform the input to list s = [s.replace(z_a[i],a_z[i]) for i in range(26)] return s Atbash),转换字母。

这是我的代码:

Python3(VERSION_HERE)

我做错了什么?我试图在那里取下并打印他所做的所有操作,但它仍然不是很清楚。

2 个答案:

答案 0 :(得分:1)

嘿,我对python也不熟悉,但我可以提供帮助!

首先我要指出,在python中,list(s)除非将其分配给变量,否则不会执行任何操作。所以在我的函数中,你会看到s = list(s),它将s重新分配给它曾经的字符串列表。我还使用字典而不是列表来映射字符。我使用你的代码,但创建一个字典,其中每个名称的值都等于Atbash将其转换为的值。例如:mapped['a'] = z。希望这是有道理的。无论如何,这是我将如何做到这一点,但我确信有很多方法来创建这个功能,我的可能不是最好的。

def cipher(s):
    a_z = map(chr, range(ord('a'), ord('z')+1))
    z_a = sorted(a_z, reverse=True)
    mapped = dict(zip(a_z, z_a))
    s = list(s)
    for i, val in enumerate(s):
        s[i] = mapped[val]
return ''.join(s)

print cipher('test')

答案 1 :(得分:0)

s = [s.replace(z_a[i],a_z[i]) for i in range(26)]

在这里,您创建了一个包含26个字符串的列表,每个字符串都是s,并修改了一个字母。您不会按顺序执行替换,将每个替换应用于上次替换的结果。您将所有替换应用于原始字符串并保留所有替换的结果。

您可以使用循环并确保替换操作已序列化,但您将遇到另一个问题:在第一次迭代期间,a将被z替换,但之后最后一个,z将被a替换。

azb - > zzb - > zzy - > ... - > zzb - > aab

我想解决这个问题的唯一方法是循环输入字符串的字符,而不是字母表中的字母。

您可以根据自己的位置创建转换字典:

conv = dict(zip(a_z, z_a))

az关联等等......

然后你可以使用列表推导来获得每个角色的翻译:

result_as_chars = (conv[char] for char in s)

然后获取一个字符串,加入这些字符:

return ''.join(result_as_chars)

完成功能:

def answer(s):
    a_z = map(chr, range(ord('a'), ord('z')+1))
    z_a = sorted(a_z, reverse=True)
    conv_table = dict(zip(a_z, z_a))
    result_as_chars = (conv_table[char] for char in s)
    return ''.join(result_as_chars)

我希望这个答案有助于为您澄清事情。但是,不要考虑这个生产质量代码。我不确定这个算法是最好的,这个实现绝不是最优化的。