如何在Python/Scala中分组聚合两个列表并处理缺失匹配项
合并两个列表并匹配对应元素
输入列表
L1 = [("A","p1",20), ("B","p2",30)] L2 = [("A","p1",100), ("c","p3",35)]
期望输出
[("A","p1",20,100), ("B","p2",30,"not in L2"), ("c","p3",35,"not in L1")]
问题描述
尝试用两个for循环遍历L1和L2,但无法正确处理元素匹配,还会生成重复输出,求实现上述需求的方法。
解决方案
用字典+集合替代双重循环,既能避免重复输出,又能提升查找效率:
步骤1:将L2转为字典,实现快速匹配
把L2的前两个元素作为唯一键,第三个元素作为对应值,这样可以在O(1)时间内完成查找:
l2_dict = {(item[0], item[1]): item[2] for item in L2}
步骤2:处理L1中的所有元素
遍历L1,为每个元素拼接L2中对应的值;若找不到匹配项,则拼接"not in L2":
result = [] for item in L1: key = (item[0], item[1]) # 用get方法,找不到则返回默认值 match_val = l2_dict.get(key, "not in L2") result.append(item + (match_val,))
步骤3:处理L2中独有的元素
先提取L1的所有键存入集合,再遍历L2,将不在L1中的元素拼接"not in L1"后加入结果:
# 用集合存储L1的键,加快存在性判断 l1_keys = {(item[0], item[1]) for item in L1} for item in L2: key = (item[0], item[1]) if key not in l1_keys: result.append(item + ("not in L1",))
最终效果
运行上述代码后,result变量将直接得到你需要的输出结果。
为什么不推荐双重循环?
双重循环会让每个L1元素与每个L2元素逐一对比,时间复杂度为O(n*m),不仅效率低,还会因重复匹配生成多余结果。而字典+集合的方式时间复杂度仅为O(n+m),逻辑清晰且无冗余输出。
内容的提问来源于stack exchange,提问作者Big data Pyspark
相关产品推荐
相关产品推荐

