有没有更有效的方法来创建映射到由一组整数移位的字母的字母字典?

问题描述

我编写了一个函数,该函数接受一个整数并返回一个字典,该字典中字母的字母映射为以整数移位的字母。它要求小写字母和大写字母必须对应,即a-> b然后A-> B。

我是python的新手,几乎没有创建列表的经验,所以我只是想知道是否存在另一种更有效甚至更优雅的方法来完成相同的结果。

import string

dictionary = []

for letter in string.ascii_lowercase + string.ascii_uppercase:
    dictionary.append(letter)
    
   

def build_shift(shift):
    
    shifted_dictionary = []
    
    for i in range(0,26):
        shifted_dictionary.append(dictionary[(i + shift) % 26])
        
    for i in range(26,53):
        shifted_dictionary.append(dictionary[(( i + shift) % 26) + 26])
        
    return (shifted_dictionary)    
 
    
mapped_dictionary = dict( zip(dictionary,build_shift(2)))  

print(mapped_dictionary)

解决方法

您可以使用dict理解来迭代每个小写和大写字符串上的字符,以输出映射到当前索引处的字符的字符加上偏移量并以26的模数进行缩减。下面是使用2作为示例的示例偏移量:

{
    c: s[(i + 2) % 26]
    for s in (string.ascii_lowercase,string.ascii_uppercase)
    for i,c in enumerate(s)
}
,

您可以对字符串进行切片,并以较少的操作次数获得所需的结果。

import string
shift = 2
changed_lc = f'{string.ascii_lowercase[shift:]}{string.ascii_lowercase[:shift]}'
changed_up = f'{string.ascii_uppercase[shift:]}{string.ascii_uppercase[:shift]}'
changed = f'{changed_lc}{changed_up}'
mapped_dictionary = dict(zip(string.ascii_letters,changed))
print(mapped_dictionary)

输出: {'a':'c','b':'d','c':'e','d':'f','e':'g','f':'h',' g':'i','h':'j','i':'k','j':'l','k':'m','l':'n','m' :'o','n':'p','o':'q','p':'r','q':'s','r':'t','s':' u','t':'v','u':'w','v':'x','w':'y','x':'z','y':'a' ,'z':'b','A':'C','B':'D','C':'E','D':'F','E':'G',' F':'H','G':'I','H':'J','I':'K','J':'L','K':'M','L' :'N','M':'O','N':'P','O':'Q','P':'R','Q':'S','R':' T','S':'U','T':'V','U':'W','V':'X','W':'Y','X':'Z' ,“ Y”:“ A”,“ Z”:“ B”}