2017-08-16 135 views
0

我试图实现和azAtbash)的转换,反转字母。Python Atbash密码

这是我的代码:

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 

我在做什么错?我试图脱掉那里,并打印他所做的每一个操作,但它仍然不是很清楚。

+0

你的意思是你想'abc'变成'zyx',比如?请显示所需的输入/输出示例。 –

+0

对不起,如果我不是很清楚。 输入“c mvevi,vevi nziph gsv hklg。” 输出“x从来没有,标志着现货。” –

回答

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) 

我希望这个答案可以帮助澄清你的东西。不过,不要考虑这个生产质量代码。我不确定这个算法是否是最好的,这个实现绝不是最优化的。

+0

非常感谢,那是我心智障碍的ATM,我正在寻找出路。 我会尝试按照你的建议,谢谢你向我解释特定的行,因为我没有完全得到它 –

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') 
+0

无论如何,没有必要将字符串“投”到列表,只要放下's = list( s)'线。你可以迭代字符串。 –

+0

我会在我的编译器上测试它,我会研究整个事情,感谢帮助家伙! –