在python中按一定值移动字母
我有一个编码的文本文件,通过简单的字母移位编码。我现在已经把它的信息分为两个列表。以这种格式:在python中按一定值移动字母,python,Python,我有一个编码的文本文件,通过简单的字母移位编码。我现在已经把它的信息分为两个列表。以这种格式: list_1 =['fjsir', 'vnjk', 'eioafnvjf', 'einbvfbj'] list_2 =[3,4,7,1] 第二个列表是字母表中应该移动多少个位置。例如,如果列表1中的索引0具有'fjsir',并且它在列表2中的对应索引是3,那么它将解码为'cfpeo'。我不确定如何在python中匹配这些字符。您可以使用ord()将字符转换为数字,并使用chr()将数字转换为字符。换
list_1 =['fjsir', 'vnjk', 'eioafnvjf', 'einbvfbj']
list_2 =[3,4,7,1]
第二个列表是字母表中应该移动多少个位置。例如,如果列表1中的索引0具有
'fjsir'
,并且它在列表2中的对应索引是3,那么它将解码为'cfpeo'
。我不确定如何在python中匹配这些字符。您可以使用ord()
将字符转换为数字,并使用chr()
将数字转换为字符。换档功能可能类似于:
def shift_string(inString, inOffset):
return "".join([chr(ord(x) + inOffset) for x in inString])
从列表中访问数组元素将留给读卡器。;)
注意:此简单版本可能会产生不需要的字符。您可以简单地使用模函数保持在ASCII范围内
def shift_string(inString, inOffset):
return "".join([chr(((ord(x) - ord(' ') + inOffset) % 95) + ord(' ')) for x in inString])
如果您的有效字符集更复杂(例如字母),则应为字符转换编写一个特殊函数。要将元素向左移动:
chr(ord(char) - n)
它用于获取字符的整数表示形式,并从该数字中减去n
。然后使用将其转换回字符
函数可以如下所示:
def shift(s, n):
return ''.join(chr(ord(char) - n) for char in s)
可以通过以下方式很好地调用:
并返回装饰:
cgpfo
rjfg
^bhZ_goc_
dhmaueai
此外,如果您只希望解码仅由英文字母表中的字母组成,则可以使用模函数%
:
def shift(s, n):
return ''.join(chr((ord(char) - 97 - n) % 26 + 97) for char in s)
只返回字母的装饰:
cgpfo
rjfg
xbhtygocy
dhmaueai
以下是一个简单的解决方案:
alphabets = 'abcdefghijklmnopqrstuvwxyz'
list_1 = ['fjsir', 'vnjk', 'eioafnvjf', 'einbvfbj']
list_2 = [3,4,7,1]
final_list = []
for index,original_word in enumerate(list_1):
new_word = ''
for letter in original_word:
if letter in alphabets:
index_val = alphabets.index(letter) - list_2[index]
new_word += alphabets[index_val]
final_list.append(new_word)
print final_list
输出:
['cgpfo'、'rjfg'、'xbhtygocy'、'dhmaueai']这可能看起来很费劲,但您是否尝试过将字母转换为数字,从列表2中减去值,然后再转换回字母?我想我们必须减去偏移量,而不是将其相加。可能还需要使用模数-毕竟这是字母移位,而不是ascii移位。@RoadRunner:是的,您可以通过调用偏移量为负数的函数来处理此问题:shift_string('fjsir',-3)
而不是shift_string('fjsir',3)
@NathanVērzemnieks:我也考虑过这一点。但不清楚输出的有效字符是什么。例如,如果只有字母是有效的,那么一个简单的模数就不够了。为什么在python中可以使用chr()、ord()和zip
时,却使用了这么多循环?我想避免使用内置函数,以使其更易于理解。这样会花费更多时间。这不是一个好的做法。而且它似乎不再简单了/@OmiHarjani-如果你的目标是让代码变得简单易懂,我建议使用更多的描述性变量:“原始单词”而不是“I”,“新单词”而不是“字母”,“字符”而不是“j”,“移位索引”而不是“索引值”,等等。还有如果列表2[index]
在这里是不必要的-这纯粹是一种优化。@NathanVērzemnieks是的,对于像我这样的傻瓜,代码保持简单谢谢你的帮助:)
alphabets = 'abcdefghijklmnopqrstuvwxyz'
list_1 = ['fjsir', 'vnjk', 'eioafnvjf', 'einbvfbj']
list_2 = [3,4,7,1]
final_list = []
for index,original_word in enumerate(list_1):
new_word = ''
for letter in original_word:
if letter in alphabets:
index_val = alphabets.index(letter) - list_2[index]
new_word += alphabets[index_val]
final_list.append(new_word)
print final_list