Python中如何将四个长度不同的列表合并为指定结构的字典
嘿,我注意到你想把几个列表整合成一个字典,但这里有个关键细节需要先澄清:列表是不能直接作为字典的键的,因为列表属于可变类型,不符合字典键必须可哈希(不可变)的要求。我根据常见的使用场景,整理了几种可行的解决方案,你可以按需选择:
场景1:每个员工ID作为独立键,关联自身名字+完整经理列表
如果你的需求是让每个员工ID单独作为键,对应的值包含该员工的名字,以及全部的经理ID和经理姓名列表,可以用zip配对员工ID与名字,再把经理列表直接加入值中:
Employee_ManagerDic = {} EmployeeID_List = [111,222,333,444,555] EmployeeFirstName_List = ['a','b','c','d','e'] managerID_List = [888,777,666] managerFirstName_List = ['f','g','h'] # 遍历员工ID和对应名字,构建字典 for emp_id, emp_name in zip(EmployeeID_List, EmployeeFirstName_List): Employee_ManagerDic[emp_id] = [emp_name, managerID_List, managerFirstName_List] print(Employee_ManagerDic)
运行后得到的结果:
{111: ['a', [888, 777, 666], ['f', 'g', 'h']], 222: ['b', [888, 777, 666], ['f', 'g', 'h']], 333: ['c', [888, 777, 666], ['f', 'g', 'h']], 444: ['d', [888, 777, 666], ['f', 'g', 'h']], 555: ['e', [888, 777, 666], ['f', 'g', 'h']]}
场景2:每个员工ID对应一个专属经理(处理列表长度不匹配)
如果你的实际需求是让每个员工对应一个经理,但员工列表(5个元素)比经理列表(3个元素)长,可以用itertools.cycle循环复用经理列表,给每个员工分配对应经理:
from itertools import cycle Employee_ManagerDic = {} EmployeeID_List = [111,222,333,444,555] EmployeeFirstName_List = ['a','b','c','d','e'] managerID_List = [888,777,666] managerFirstName_List = ['f','g','h'] # 循环配对经理ID与姓名,确保每个员工都有对应经理 cycled_managers = cycle(zip(managerID_List, managerFirstName_List)) for emp_id, emp_name, (mgr_id, mgr_name) in zip(EmployeeID_List, EmployeeFirstName_List, cycled_managers): Employee_ManagerDic[emp_id] = [emp_name, mgr_id, mgr_name] print(Employee_ManagerDic)
运行结果:
{111: ['a', 888, 'f'], 222: ['b', 777, 'g'], 333: ['c', 666, 'h'], 444: ['d', 888, 'f'], 555: ['e', 777, 'g']}
场景3:坚持用员工ID列表作为“键”(转换为tuple)
如果你确实想把整个员工ID列表作为类似键的存在,可以把列表转换成tuple(不可变类型,可作为字典键),再关联另外三个列表:
Employee_ManagerDic = {} EmployeeID_List = [111,222,333,444,555] EmployeeFirstName_List = ['a','b','c','d','e'] managerID_List = [888,777,666] managerFirstName_List = ['f','g','h'] # 将员工ID列表转为tuple作为键 Employee_ManagerDic[tuple(EmployeeID_List)] = [EmployeeFirstName_List, managerID_List, managerFirstName_List] print(Employee_ManagerDic)
结果:
{(111, 222, 333, 444, 555): [['a', 'b', 'c', 'd', 'e'], [888, 777, 666], ['f', 'g', 'h']]}
你可以根据自己的实际业务需求选择对应的方案哦~
内容的提问来源于stack exchange,提问作者W. Yan
相关产品推荐
相关产品推荐

