Python合并字典时触发TypeError: 'NoneType' object is not a mapping的原因
字典合并时的TypeError问题分析
问题现象
你在合并字典时触发了如下错误:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[3], line 5 3 dict_list = [{"a":1}, None, {"b":2}] 4 n = len(dict_list) ----> 5 [{"a": 1, "b": 2, **dict_list[idx]} for idx in range(n)] Cell In[3], line 5 3 dict_list = [{"a":1}, None, {"b":2}] 4 n = len(dict_list) ----> 5 [{"a": 1, "b": 2, **dict_list[idx]} for idx in range(n)] TypeError: 'NoneType' object is not a mapping
你的代码如下:
import random # list of dictionaries: dict_list = [{"a":1}, None, {"b":2}] n = len(dict_list) [{"a": 1, "b": 2, **dict_list[idx]} for idx in range(n)]
问题原因
- 你的
dict_list里包含了一个None元素,而字典解包操作**只能作用于映射类型(比如字典),None不属于映射类型,当循环到dict_list[1](也就是None)时,尝试执行**None就会触发这个错误。 - 列表推导式会遍历列表的每一个元素,包括
None,所以必然会在第二次循环时出错。
解决方法
根据你的需求,有两种常见处理方式:
方式1:跳过列表中的None元素
如果不需要处理None,直接过滤掉:
dict_list = [{"a":1}, None, {"b":2}] base_dict = {"a": 1, "b": 2} # 过滤None后再合并 result = [{**base_dict, **d} for d in dict_list if d is not None] print(result) # 输出: [{'a': 1, 'b': 2}, {'a': 1, 'b': 2}]
方式2:把None当作空字典处理
如果希望保留对应位置的结果,将None视为空字典:
dict_list = [{"a":1}, None, {"b":2}] base_dict = {"a": 1, "b": 2} # 用d or {}将None转为空字典 result = [{**base_dict, **(d or {})} for d in dict_list] print(result) # 输出: [{'a': 1, 'b': 2}, {'a': 1, 'b': 2}, {'a': 1, 'b': 2}]
内容的提问来源于stack exchange,提问作者Anmol Deep
相关产品推荐
相关产品推荐

