Python中为何会抛出‘map object is not a mapping’异常?
为什么
{**map(a,b)}会提示“map对象不是mapping”? 直接报错原因
{**x}这种写法是字典拆包操作,Python要求x必须是mapping类型(比如dict,或者实现了mapping协议的自定义对象)——简单说就是得是“键值对”结构的对象。但map()函数返回的是迭代器对象,它只是一个能逐个产出元素的序列,根本不是键值对结构,所以Python会报错说它不是mapping。
顺便纠正你对map的误用
你写的map(a,b)本身用法就不对:map的第一个参数必须是可调用对象(比如函数、lambda),用来处理第二个参数(迭代器)里的每个元素。你传了列表a当第一个参数,相当于要把b里的每个元素(比如'a')当作索引去取a里的元素(a['a']),这本身就会触发TypeError,只不过因为你用了**拆包,优先级更高,所以先报了“不是mapping”的错。
如果你想把两个列表转成字典(键来自a,值来自b)
正确的做法是用zip()把两个列表的对应元素配对,再转成字典:
- 方法1:用
dict()直接转换
a = [1,2,3,4] b = ['a','b','c','d'] result = dict(zip(a, b)) # 结果是 {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
- 方法2:用字典推导式
result = {key: val for key, val in zip(a, b)}
补充:map对象到底是什么?
map()返回的是惰性迭代器,它不会立刻计算所有结果,而是在你迭代它的时候(比如用for循环、list()转换)才会逐个对元素应用函数。它存储的是“怎么生成元素”的逻辑,不是键值对,所以完全不符合mapping的要求。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

