合并含重复键的列表为字典时代码失效,求正确实现方法
解决重复键生成字典的问题
首先要明确:你期望的{1: 1, 2, 2:3}不符合Python字典的语法规范——字典的键必须唯一,同一个键不能对应多个独立的值。正确的做法是将重复键对应的所有值存入一个列表,最终得到{1: [1, 2], 2: [3]}这样的结构。
你的代码报错的原因有两个:
- 未提前初始化
dictionary1字典; - 当键不存在时直接调用
append()会触发KeyError,因为字典中还没有该键对应的列表对象。
下面是几种可行的实现方案:
方案一:手动判断键是否存在
keys = [1, 1, 2] values = [1, 2, 3] dictionary1 = {} for k, v in zip(keys, values): if k not in dictionary1: dictionary1[k] = [] dictionary1[k].append(v) print(dictionary1) # 输出: {1: [1, 2], 2: [3]}
方案二:使用collections.defaultdict(推荐)
借助defaultdict可以自动为不存在的键创建指定类型的默认值(这里是列表),代码更简洁:
from collections import defaultdict keys = [1, 1, 2] values = [1, 2, 3] dictionary1 = defaultdict(list) for k, v in zip(keys, values): dictionary1[k].append(v) # 若需要转为普通字典,执行 dict(dictionary1) print(dict(dictionary1)) # 输出: {1: [1, 2], 2: [3]}
方案三:使用字典的setdefault方法
setdefault方法会检查键是否存在,不存在则设置默认值并返回,存在则直接返回对应值,可简化循环逻辑:
keys = [1, 1, 2] values = [1, 2, 3] dictionary1 = {} for k, v in zip(keys, values): dictionary1.setdefault(k, []).append(v) print(dictionary1) # 输出: {1: [1, 2], 2: [3]}
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

