Python字典值位置交换方法及基于凯撒密码的数字映射加密字典调整问题
问题1:如何在Python字典中交换或修改值的位置?
操作起来其实很简单,分两种场景说:
修改单个值:直接通过键重新赋值就行。比如你有字典
my_dict = {'a': 1, 'b': 2},要把'b'的值改成3,直接写my_dict['b'] = 3就搞定了。交换两个值的位置:可以用临时变量过渡,或者用Python的解包语法更简洁。比如交换
my_dict中'a'和'b'的值:my_dict = {'a': 1, 'b': 2} # 方法1:临时变量过渡 temp = my_dict['a'] my_dict['a'] = my_dict['b'] my_dict['b'] = temp # 方法2:解包语法(更清爽) my_dict['a'], my_dict['b'] = my_dict['b'], my_dict['a']
如果需要批量调整多个值,循环遍历字典的键值对,根据条件修改映射关系就行。
问题2:基于凯撒密码调整字典映射的解决方案
先拆解你的需求:当密钥为D3时,字典要变成{0: 'd', 1: 'e', 2: 'f', 3: 'a', 4: 'b', 5: 'c', 6: 'g', 7: 'h'...},本质是把字母表的前3个字符(a、b、c)移到d、e、f之后,后面的字符保持原顺序。
下面是修正并优化后的代码,我会逐段解释:
import string def build_shifted_dict(shift): # 获取完整小写字母表并转为列表 lowercase = list(string.ascii_lowercase) # 把前shift个字符移到列表末尾,生成偏移后的字母序列 shifted_letters = lowercase[shift:] + lowercase[:shift] # 构建键为0-25、值为偏移后字母的字典 return {i: char for i, char in enumerate(shifted_letters)} # 处理用户输入 message = input("Enter a message\n") key_input = input("Enter a key\n") # 解析密钥:兼容「字母+数字」或纯字母输入 shift = 0 if key_input: # 先提取密钥中的数字部分作为偏移量 num_part = ''.join([c for c in key_input if c.isdigit()]) if num_part: shift = int(num_part) else: # 没有数字的话,取第一个字母对应的索引(a=0,d=3)作为偏移量 first_char = key_input[0].lower() shift = string.ascii_lowercase.index(first_char) # 生成调整后的字典 shifted_dict = build_shifted_dict(shift) print("调整后的字典:", shifted_dict) # 修复加密逻辑:避免重复添加字符,兼容非字母内容 encrypted = [] for val in message.lower(): # 统一转小写处理,避免大小写问题 if val in string.ascii_lowercase: # 找到字母对应的键,加1后加入加密列表 for key, char in shifted_dict.items(): if char == val: encrypted.append(str(key + 1)) break else: # 非字母字符(空格、标点等)直接保留 encrypted.append(val) # 用空格分隔加密后的数字,输出结果 encrypted_message = ' '.join(encrypted) print("加密后的消息:", encrypted_message)
关键部分说明:
build_shifted_dict函数:核心逻辑是根据偏移量shift重构字母表。比如shift=3时,字母表会从[a,b,c,d,e,f,...]变成[d,e,f,a,b,c,g,...],再通过枚举生成你需要的键值对。- 密钥解析:兼容两种输入方式——输入
D3会提取数字3作为偏移量,输入D也会自动计算出偏移量3(因为d在字母表中是第3位,从0开始计数)。 - 加密逻辑修复:原代码会重复添加字符(每个字母触发两次写入),现在改成找到对应键后立即break,同时保留空格、标点等非字母内容,更实用。
测试时输入密钥D3,打印的字典就会和你期望的一致,加密功能也能正确把字母转换成对应数字(比如d转成1,a转成4)。
内容的提问来源于stack exchange,提问作者Ahmad Syahmi
相关产品推荐
相关产品推荐

