Caesar使用列表理解来移动列表元素

时间:2015-02-22 00:12:56

标签: python list list-comprehension

我是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] 

我现在需要的只是执行实际的转变,但我很难过:/

3 个答案:

答案 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)

  1. 环绕: Caesar Shift是w环绕式移位密码。所以你必须有一个算法来包装字符串。如果您将字母视为数字,那么您可以将字母写为[0,1 ... 25],即range(26)。如果你对此进行10次凯撒移位,你会得到:[10,11 ... 25,26 ...... 35]。字符26不在字母表中。您需要将其更改为0.您需要将27更改为1,依此类推。因此,您正在寻找的转换(如果字母表从0到25排列)是mod( letterValue + 10, 26)

  2. 但是,字母不是从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)

  3. 非字母字符:?!等字符会转换为什么?这些通常不会改变。您可以使用if条件提供该条件,并检查所请求的字符是否在string.ascii_lowercase中。

  4. 类似的东西:

    from string import ascii_lowercase as lowerLetters
    
    def toCaesar(ch):
    
        if ch in lowerLetters: 
            return chr((chr(ch) - 86)%26 + 96)
        else:
            return ch
    

    其余我认为你已经......