不使用pandas如何按子列表前两项匹配求嵌套列表交集并拼接末项
实现方案
核心思路
用字典做匹配映射能把时间复杂度控制在O(n+m),比双重循环的O(n*m)效率高很多,尤其数据量大的时候优势明显:
- 先把
list2处理成字典:以每个子列表前两项组成的不可变元组作为键,对应子列表的末尾元素作为值 - 遍历
list1的每个子列表,同样取前两项转成元组去字典里匹配 - 匹配成功就把前两项+list1的末尾元素+匹配到的list2的末尾元素拼成新子列表,加入结果集
可直接运行的代码
# 注意示例里的字符串要加引号,否则Python会报未定义变量错误 list1 = [[123, 'Harold', 5], [321, 'John', 3], [222, 'John', 2]] list2 = [[333, 'James', 3], [123, 'Harold', 6], [999, 'John', 2]] # 构建list2的匹配映射 match_map = {tuple(item[:2]): item[-1] for item in list2} # 生成结果 intersect_list = [] for item in list1: key = tuple(item[:2]) if key in match_map: intersect_list.append(item[:2] + [item[-1], match_map[key]]) print(intersect_list)
运行输出
和预期结果完全一致:
[[123, 'Harold', 5, 6]]
边缘情况兼容
如果存在特殊场景可以简单调整代码适配:
- 要是前两项匹配后需要拼接除了前两项之外的所有元素,把代码里的
item[-1]改成item[2:]即可 - 要是允许同一个匹配键在list2里有多个对应值,把字典的value改成列表存储所有对应值即可
内容的提问来源于stack exchange,提问作者Anders Begtorp
相关产品推荐
相关产品推荐

