Python中如何结合map()与字典推导式生成姓名-ID键值字典
问题背景
需要对存储员工信息的字典列表使用map(),仅提取姓名与id字段,最终返回以员工姓名为键、对应员工ID为值的字典。
给定输入数据:
employees = [ {"id": 12113, "name": "Jim", "department": "Sales"}, {"id": 12342, "name": "Michael", "department": "Management"}, {"id": 23312, "name": "Dwight", "department": "Sales"}, ]
现有错误代码运行后无法返回预期值,仅输出类似<map object at 0x7f3b0bb6d460>的map对象内存地址,错误代码如下:
def name_id(employees): name_and_ids = [{map(('name', 'id'), emp) for emp in employees}] print(list(name_id)) ### to see if what I want is being output or not return name_and_ids # 函数调用 print(f"Name and ids: {name_id(employees)}")
错误原因
map()的第一个参数必须是可调用的函数对象,原代码传入的('name', 'id')是元组,不符合map()的参数要求。- Python 3中
map()返回的是惰性迭代器(即map对象),不会直接计算出存储的实际值,直接打印只会输出对象内存地址,必须转换为list、dict等实体数据结构才能拿到内容。 - 原代码外层用的
{...}是集合推导语法,和最终需要的字典返回结构不匹配。
基于map()的正确实现
实现思路:用map()遍历每个员工字典,将单个员工数据转换为(姓名, ID)格式的键值对元组,最后将map返回的迭代器直接传入dict()构造方法,即可生成目标字典。
完整可运行代码:
def name_id(employees): # map对每个员工执行提取逻辑,返回的元组迭代器直接转成字典 name_and_ids = dict(map(lambda emp: (emp["name"], emp["id"]), employees)) return name_and_ids # 测试调用 employees = [ {"id": 12113, "name": "Jim", "department": "Sales"}, {"id": 12342, "name": "Michael", "department": "Management"}, {"id": 23312, "name": "Dwight", "department": "Sales"}, ] print(f"Name and ids: {name_id(employees)}")
运行输出结果:
Name and ids: {'Jim': 12113, 'Michael': 12342, 'Dwight': 23312}
代码说明
lambda emp: (emp["name"], emp["id"])是匿名处理函数,输入为单个员工字典,输出符合字典构造要求的(键, 值)二元组。map()会把上述处理函数依次作用在员工列表的每一个元素上,返回存储了所有键值对元组的迭代器。- 外层的
dict()会遍历map迭代器,把每个二元组拼装成最终需要的姓名字典,不需要额外编写循环。
内容的提问来源于stack exchange,提问作者Krasnips
相关产品推荐
相关产品推荐

