使用dict.get初始化空列表并追加值时返回None的问题及解决
问题分析与解决方案
为什么原代码会返回None?
有两个核心原因:
append()方法的返回值特性:列表的append()是原地修改操作,它不会返回修改后的列表,而是固定返回None。所以你把policy_models.get(r, []).append(r)赋值给p,得到的必然是None。- 临时默认列表未存入字典:当使用
policy_models.get(r, [])时,如果键r不存在,会生成一个临时空列表,但这个列表并没有被添加到policy_models字典中。所以每次循环取同一个不存在的键,都会得到新的临时空列表,字典本身始终是空的,自然无法累积值。
正确实现方法
下面提供三种靠谱的实现方式,都能完成「键不存在则创建列表并追加值,存在则追加值」的需求:
方法1:使用dict.setdefault()(推荐,无需额外导入)
setdefault()方法会自动检查键是否存在:不存在则设置默认值(这里是空列表),并返回该值;存在则直接返回对应的值。返回的列表是存在字典中的,所以修改它会同步到字典里。
policy_models = {} res = ['1', '1', '2', '3', 'x'] for idx, r in enumerate(res): # 获取或创建键对应的列表 target_list = policy_models.setdefault(r, []) # 向列表追加值 target_list.append(r) print(idx, r, target_list)
输出:
0 1 ['1'] 1 1 ['1', '1'] 2 2 ['2'] 3 3 ['3'] 4 x ['x']
此时policy_models的内容为:{'1': ['1', '1'], '2': ['2'], '3': ['3'], 'x': ['x']}
方法2:使用collections.defaultdict(更简洁)
提前指定字典的默认值类型为列表,访问不存在的键时会自动创建空列表,无需手动判断。
from collections import defaultdict policy_models = defaultdict(list) res = ['1', '1', '2', '3', 'x'] for idx, r in enumerate(res): target_list = policy_models[r] target_list.append(r) print(idx, r, target_list)
输出和方法1完全一致,字典会自动维护键对应的列表。
方法3:手动判断键是否存在(最直观,适合新手理解)
直接检查键是否在字典中,不存在就初始化空列表,再追加值:
policy_models = {} res = ['1', '1', '2', '3', 'x'] for idx, r in enumerate(res): if r not in policy_models: policy_models[r] = [] target_list = policy_models[r] target_list.append(r) print(idx, r, target_list)
逻辑清晰,没有依赖任何特殊方法,适合理解底层逻辑。
内容的提问来源于stack exchange,提问作者Pranjal Doshi
相关产品推荐
相关产品推荐

