如何高效匹配两个多维列表/数组并优化结果?
多维列表匹配优化实现
需求说明
需要处理两个21行的多维列表,实现从a1中查找与b1的匹配项,先生成包含空列表的匹配结果,再过滤掉所有空列表得到最终结果。
示例数据
a1 = [ [ [91,15,25], [4,14,25] ], [ [91,115,215], [41,154,148] ] ] b1 = [ [ [41,4,14], [3,5,14] ], [ [266,41,73], [366,13,91] ] ]
原有实现问题
原有代码通过索引切片+多层嵌套循环+集合交集实现,但每次循环都重复将子列表转为集合,处理大数据量时耗时较长,且代码冗余:
for l in a1[0]: result = [] for k in b1[0]: result.append(list(set(l) & set(k))) print(result) for l in a1[1]: result = [] for k in b1[1]: result.append(list(set(l) & set(k))) print(result)
优化方案
核心思路
- 提前将
a1和b1的所有子列表转换为集合,避免循环中重复转换的开销 - 使用嵌套列表推导式简化代码结构,提升执行效率
- 分两步生成目标结果:先得到包含空列表的
result1,再过滤空列表得到result2
优化代码
# 提前转换所有子列表为集合,减少重复计算 a_sets = [[set(sublist) for sublist in arr] for arr in a1] b_sets = [[set(sublist) for sublist in arr] for arr in b1] # 生成包含空列表的result1 result1 = [ [list(a_set & b_set) for b_set in b_arr] for a_arr, b_arr in zip(a_sets, b_sets) ] # 过滤空列表得到result2 result2 = [ [match for match in arr if match] for arr in result1 ] print("result1:", result1) print("result2:", result2)
输出结果
# result1输出 [[[], [], [4, 14], [14]], [[], [91], [41], []]] # result2输出 [[[4, 14], [14]], [[91], [41]]]
优势说明
- 提前转换集合:将每个子列表转集合的操作只执行一次,而非每次循环都执行,大幅减少大数据量下的计算开销
- 列表推导式:相较于显式for循环,Python底层对列表推导式的优化更好,执行速度更快
- 代码简洁:通过
zip配对a1和b1的对应层级,避免硬编码索引,扩展性更强(适配任意行数的输入)
内容的提问来源于stack exchange,提问作者user20250014
相关产品推荐
相关产品推荐

