为什么append操作返回None?交换字典键值时遇此问题
字典键值交换(值重复时合并键到列表)的问题修复
你的代码存在的3个核心问题:
- 对append方法的误解:
list.append()是原地修改列表的方法,它的返回值为None,你打印这个返回值自然会输出None,且不需要将其返回值赋值给任何变量。 - 逻辑覆盖错误:当你执行
new_d[v] = list(k)时,直接把之前已经追加了新元素的列表覆盖成了只包含当前k的新列表,这就是最终1对应的结果是['c']而非['a','c']的原因。 - 遗漏值不存在的情况:当
new_d中没有当前值v时,你没有处理这种场景,导致像2这样的唯一值对应的键没有被加入新字典。
修正后的代码:
def swap_keys_and_values(d): new_d = {} for k, v in d.items(): if v in new_d: # 值已存在,直接追加键到对应列表 new_d[v].append(k) else: # 值不存在,创建新列表存入当前键 new_d[v] = [k] return new_d print(swap_keys_and_values({'a': 1, 'b': 2, 'c': 1}))
输出结果:
{1: ['a', 'c'], 2: ['b']}
简化实现(可选):
可以用collections.defaultdict简化代码逻辑,自动处理值不存在的情况:
from collections import defaultdict def swap_keys_and_values(d): new_d = defaultdict(list) for k, v in d.items(): new_d[v].append(k) # 转成普通字典(可选操作) return dict(new_d)
内容的提问来源于stack exchange,提问作者Julian Sanjuan
相关产品推荐
相关产品推荐

