Python中如何将不同长度的列表转换为字典?
问题需求
需要将两个长度不同的列表转换为指定格式的字典,示例如下:
listA = [123,456] listB = ['B123', 'C123', 'B456', 'C456'] # 注:原示例中listB的第二个元素应为'C123'才能匹配预期输出 # 预期输出 DictA = {123:['B123', 'C123'], 456: ['B456', 'C456']} ---------------------------------------------- listA = [123,456,789] listB = ['B123' , 'C123', 'B456', 'C456', 'B789', 'C789'] # 预期输出 DictA = {123:['B123', 'C123'], 456: ['B456', 'C456'], 789: ['B789', 'C789']}
原尝试代码报错:
[ {a: [b,c]} for (a, b,c) in zip(product(listA ,listB ))]
问题分析
原代码存在两个核心问题:
product(listA, listB)会生成两个列表的笛卡尔积(所有元素组合),并非所需的一一分组对应,且生成的是二元组,无法解包为a,b,c三个变量,直接触发ValueError。- 列表推导式最终生成的是多个字典组成的列表,不符合目标单个字典的要求。
解决方案
方案1:按固定分组配对(适用于listB长度为listA的2倍且顺序严格对应)
利用切片将listB按每2个元素为一组,再与listA配对生成字典:
listA = [123,456] listB = ['B123', 'C123', 'B456', 'C456'] # 先将listB分成每2个元素一组 groups = [listB[i:i+2] for i in range(0, len(listB), 2)] # 配对生成字典 dictA = dict(zip(listA, groups)) print(dictA) # 输出: {123: ['B123', 'C123'], 456: ['B456', 'C456']}
或者用更简洁的迭代器写法:
dictA = {num: group for num, group in zip(listA, zip(*[iter(listB)]*2))}
方案2:按元素内容匹配(适用于listB元素包含对应数字前缀的场景)
如果listB的元素格式是BXXX/CXXX(XXX对应listA中的数字),可以通过提取元素中的数字部分来匹配分组:
listA = [123,456,789] listB = ['B123' , 'C123', 'B456', 'C456', 'B789', 'C789'] # 初始化字典,每个listA元素对应空列表 dictA = {num: [] for num in listA} for item in listB: # 提取元素中的数字部分并转为整数 num = int(item[1:]) if num in dictA: dictA[num].append(item) print(dictA) # 输出: {123: ['B123', 'C123'], 456: ['B456', 'C456'], 789: ['B789', 'C789']}
这个方案更灵活,即使listB的元素顺序打乱,只要包含对应数字就能正确分组。
内容的提问来源于stack exchange,提问作者jhonatanalfred
相关产品推荐
相关产品推荐

