Python遍历两个列表生成键唯一且值可含多个项的字典实现方法
实现方案
核心处理分两个阶段完成,逻辑简单不容易出错:
- 第一阶段聚合:同步遍历两个位置对应的列表,把相同车牌关联的所有分组统一归集到列表中,避免漏记多分组归属
- 第二阶段格式适配:聚合完成后检查每个车牌对应的分组数量,仅归属1个分组的直接存储单字符串值,归属多个分组的保留列表结构
基础实现(无额外依赖)
不需要导入任何模块,纯基础语法即可实现,兼容性最好:
L1 = ['173', '607', '607', '581', '522', '522'] L2 = ['fleet 6', 'fleet 4', 'fleet 6', 'Toyota', 'Maintenance', 'fleet 1'] # 聚合所有车牌对应的分组 temp = {} for plate, group in zip(L1, L2): if plate not in temp: temp[plate] = [] temp[plate].append(group) # 按要求适配单值/列表格式 result = {} for plate, groups in temp.items(): result[plate] = groups[0] if len(groups) == 1 else groups
运行后得到的result完全匹配预期输出:
{ '173': 'fleet 6', '607': ['fleet 4', 'fleet 6'], '581': 'Toyota', '522': ['Maintenance', 'fleet 1'] }
简洁写法(借助标准库)
如果可以使用Python标准库,用collections.defaultdict可以省略key存在性判断的代码,写法更简洁:
from collections import defaultdict L1 = ['173', '607', '607', '581', '522', '522'] L2 = ['fleet 6', 'fleet 4', 'fleet 6', 'Toyota', 'Maintenance', 'fleet 1'] temp = defaultdict(list) for plate, group in zip(L1, L2): temp[plate].append(group) result = {k: v[0] if len(v) == 1 else v for k, v in temp.items()}
注意事项
- 用
zip(L1, L2)配对元素的前提是两个列表长度一致,和位置对应关系的需求完全匹配,不需要手动维护索引遍历 - 不建议在遍历初始阶段就判断是否存单值,很容易出现后续遇到重复车牌时把之前的单值覆盖、丢失分组的问题,先全量聚合再做格式转换的逻辑容错性更高
内容的提问来源于stack exchange,提问作者Андрей Романов
相关产品推荐
相关产品推荐

