You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:53:31