Python如何不使用sorted等方法交换字典两个键值对的顺序
Python字典指定键值对位置互换方案
需求说明
需要在不使用sorted等排序类函数的前提下,交换字典中两个指定键值对的排列顺序。
示例原始字典:
dico = {'a': [0, 0, '-', 'b'], 'b': [0, 0, 'c', 'd'], 'c': [1, 0, 'a', 'b'], 'd': [0, 0, 'c', '-']}
预期交换键b和键c位置后的效果:
dico = {'a': [0, 0, '-', 'b'], 'c': [1, 0, 'a', 'b'], 'b': [0, 0, 'c', 'd'], 'd': [0, 0, 'c', '-']}
注:Python 3.7及以上版本的字典默认会保留键值对的插入顺序,是实现该需求的基础。
实现代码
通过单次遍历原字典重建新字典的方式即可实现,全程不涉及排序操作:
def swap_dict_key_positions(origin_dict: dict, key_a, key_b) -> dict: # 校验待交换键是否存在 if key_a not in origin_dict or key_b not in origin_dict: raise KeyError("待交换的两个键必须都存在于原字典中") new_dict = {} for k, v in origin_dict.items(): if k == key_a: # 遍历到第一个待交换键时,先写入第二个键的键值对 new_dict[key_b] = origin_dict[key_b] elif k == key_b: # 遍历到第二个待交换键时,写入第一个键的键值对 new_dict[key_a] = origin_dict[key_a] else: # 其余键值对保持原有顺序写入 new_dict[k] = v return new_dict # 调用测试 dico = {'a': [0, 0, '-', 'b'], 'b': [0, 0, 'c', 'd'], 'c': [1, 0, 'a', 'b'], 'd': [0, 0, 'c', '-']} dico = swap_dict_key_positions(dico, 'b', 'c') print(dico) # 输出结果与预期完全一致:{'a': [0, 0, '-', 'b'], 'c': [1, 0, 'a', 'b'], 'b': [0, 0, 'c', 'd'], 'd': [0, 0, 'c', '-']}
逻辑说明
- 整个实现仅做一次原字典遍历,时间复杂度为O(n),没有调用任何排序类方法,完全符合需求约束。
- 遍历过程中遇到两个待交换键时交叉写入对应值,其余键按原有遍历顺序写入新字典,最终新字典的键顺序就会实现两个指定键位置互换的效果。
- 如果需要原地修改原字典而非生成新字典,可以结合
pop、popitem方法操作,但逻辑相对繁琐,更推荐上述重建字典的实现,可读性和稳定性更高。
内容的提问来源于stack exchange,提问作者satia
相关产品推荐
相关产品推荐

