我正在尝试实现并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)
我做错了什么?我试图在那里取下并打印他所做的所有操作,但它仍然不是很清楚。
答案 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))
将a
与z
关联等等......
然后你可以使用列表推导来获得每个角色的翻译:
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)
我希望这个答案有助于为您澄清事情。但是,不要考虑这个生产质量代码。我不确定这个算法是最好的,这个实现绝不是最优化的。