Python 有没有更有效的方法来创建一个字母字典,该字典将字母映射为一个整数移位的字母?

Python 有没有更有效的方法来创建一个字母字典,该字典将字母映射为一个整数移位的字母?,python,performance,dictionary,coding-efficiency,Python,Performance,Dictionary,Coding Efficiency,我编写了一个函数,它接受一个整数并返回一个字典,其中字母表的字母映射到一个被整数移位的字母表。它要求小写字母和大写字母必须对应,即如果a->b,则a->b 我对python相当陌生,对创建列表几乎没有经验,所以我想知道是否有一种更有效甚至更优雅的方法来完成相同的结果 import string dictionary = [] for letter in string.ascii_lowercase + string.ascii_uppercase: dictionary.append

我编写了一个函数,它接受一个整数并返回一个字典,其中字母表的字母映射到一个被整数移位的字母表。它要求小写字母和大写字母必须对应,即如果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)
}

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

导入字符串
班次=2
已更改的_lc=f'{string.ascii_lowercase[shift:]}{string.ascii_lowercase[:shift]}'
更改了_up=f'{string.ascii_大写[shift:]}{string.ascii_大写[:shift]}'
changed=f'{changed_lc}{changed_up}'
mapped_dictionary=dict(zip(string.ascii_字母,已更改))
打印(映射字典)
输出:
“c”、“a”和a”的一部分是这样的一个,其中一个是“c”、“b”的一个是“c”的一个是这样的,f’:“h”、“g”g”的一个是“i”、“i”的一个是目前的一个是,c”的一个是,c的一个是“c”、“b”的一个是,c”的一个是“c”的是,f”的是,f,f,f”的是指,f,f,f”和g的以下以下以下以下的是“g:::::::'g,g,g,g”的以下以下以下以下以下以下以下是“i,我,我,我的是“i,我,我,我是“i i i’:::::::::“i i”和我,我,我,我,我,我,我,我,我,我的以下以下以下以下以下以下以下以下是是“c,我,我,我,我,我的:'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'}

我不是一个执着于代码优化的人,所以我会让其他人来回答代码优化的问题。不过作为一般性的评论,我建议不要将列表称为字典,因为字典是与列表完全独立的数据结构-你只会把阅读代码的人弄糊涂(这个人可能就是你自己)。哦,我明白你的意思了,就是这样,我想字母表会更合适,也不会那么令人困惑困难的是,如果我只减少模26,甚至52,我会把大写字母映射到小写字母,并有一定的移位。2的移位会将“Z”映射到“b”,但要求将其映射到“b”。如果不分别处理小写和大写的情况,我想不出怎么做,你的方法可以做到吗?这就是s的
(string.ascii\u小写,string.ascii\u大写)
。通过单独循环字符串,而不是先连接字符串,它可以完全满足您的需要。请看演示:谢谢,我将不得不回顾这些命令,不熟悉f'{}one,您可以参考一些f字符串的示例