我是Python的新手,遇到过障碍。是否可以使用列表推导来对列表中单词的每个字母执行转换?我怎么能以类似的列表理解方式利用ord()和chr()?
到目前为止,我有以下代码:
def shift( file1="file1.txt", file2 ="file2.txt"):
key = int(input("Enter shift key: "))
with open(" file1. txt") as readfile:
lines = readfile.readlines()
lines = [words.lower() for words in lines]
lines = [ words.split(" ") for words in lines]
我现在需要的只是执行实际的转变,但我很难过:/
答案 0 :(得分:0)
您可以使用str.join
,在ch/character
的每个word
中迭代每个word_list
,您可以使用您创建密码的任何公式。
word_list = ["Foo","Bar","Foobar"]
print(["".join(chr(ord(ch) + 10) for ch in word.lower()) for word in word_list ])
['pyy', 'lk|', 'pyylk|']
答案 1 :(得分:0)
这是一个简单的凯撒转换使用理解:
>>> string = 'CaesarShift'; shift=3
>>> ''.join(chr(ord('a') + (ord(c)-ord('a')+shift) % 26) for c in string)
'zdhvdupkliw'
这说明了这个概念,但没有尝试处理空格或标点符号。
>>> new = ''.join(chr(ord('a') + (ord(c)-ord('a')+shift) % 26) for c in string.lower())
>>> ''.join(chr(ord('a') + (ord(c)-ord('a')-shift) % 26) for c in new)
'caesarshift'
答案 2 :(得分:0)
环绕:
Caesar Shift是w环绕式移位密码。所以你必须有一个算法来包装字符串。如果您将字母视为数字,那么您可以将字母写为[0,1 ... 25],即range(26)
。如果你对此进行10次凯撒移位,你会得到:[10,11 ... 25,26 ...... 35]。字符26不在字母表中。您需要将其更改为0.您需要将27更改为1,依此类推。因此,您正在寻找的转换(如果字母表从0到25排列)是mod( letterValue + 10, 26)
。
但是,字母不是从0开始。所以你必须先减去ord('a')
的值,然后再添加它。上面表达式中的letterValue
只是:ord(ch) - ord('a')
。因此,您将早期表达式更改为(chr(ch) - ord('a') + 10) % 26
。然后我们使用:chr((chr(ch) - ord('a') + 10) % 26 + ord('a'))
将其更改回来。由于ord('a')
为96
,您可以使用以下代码加快此过程:chr((chr(ch) - 96 + 10)%26 + 96)
,即chr((chr(ch)-86)%26 + 96)
非字母字符:?
和!
等字符会转换为什么?这些通常不会改变。您可以使用if
条件提供该条件,并检查所请求的字符是否在string.ascii_lowercase
中。
类似的东西:
from string import ascii_lowercase as lowerLetters
def toCaesar(ch):
if ch in lowerLetters:
return chr((chr(ch) - 86)%26 + 96)
else:
return ch
其余我认为你已经......