Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中按一定值移动字母_Python - Fatal编程技术网

在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