如何高效匹配同长度嵌套列表对应层级的交集元素
批量实现嵌套列表对应层级的元素匹配
我有两个结构完全一致的嵌套列表(层级和每个层级的元素数量都对应,且数据量较大,超过11行),需要实现df[i]与df2[i]对应位置的子列表两两求交集——也就是df[i][j]和df2[i][j]找共同元素、df[i][j]和df2[i][k]找共同元素,以此类推,不想逐个写匹配逻辑,有没有简便的实现方式?
示例数据
df = [[[1, 5,7,9,12,13,17], [2,17,18,23,32,34,45], [3,5,11,33,34,36,45]], [[6,21,22,50,56,58,72], [7,5,12,13,55,56,74], [8,23,24,32,56,58,64]]] df2 = [[[100,5,12,15,27,32,54], [120,10,17,18,19,43,55], [99,21,32,33,34,36,54]], [[41,16,32,45,66,67,76], [56,10,11,43,54,55,56], [77,12,16,18,19,21,23]]]
期望输出
output = [[[[5, 12], [17]], [[17, 18], [32, 34, 36]]], [[[55, 56], [32]], [[56]]]]
实现方法
可以用Python的嵌套列表推导式结合集合求交集来批量处理,不需要逐个编写匹配逻辑,代码简洁高效,适合大规模数据:
# 核心逻辑:遍历对应层级的子列表,两两求交集并按顺序整理 output = [ [ [sorted(list(set(sub_df) & set(sub_df2))) for sub_df2 in df2_level] for sub_df in df_level ] for df_level, df2_level in zip(df, df2) ] # 若不需要元素排序,直接去掉sorted即可: # output = [ # [ # [list(set(sub_df) & set(sub_df2)) # for sub_df2 in df2_level] # for sub_df in df_level # ] # for df_level, df2_level in zip(df, df2) # ]
代码说明
zip(df, df2):将两个大列表按对应位置配对,每次取出df和df2的同一层级子列表(比如df[0]和df2[0]、df[1]和df2[1])。- 嵌套推导式:遍历当前层级下的所有子列表组合,自动完成所有位置的匹配。
set(sub_df) & set(sub_df2):利用集合的交集操作快速找出共同元素,效率远高于手动遍历匹配。sorted(...):如果需要输出的交集元素是有序的,添加排序即可;若不需要顺序,直接转成列表就行。
运行上述代码后,得到的结果与期望输出完全一致。
内容的提问来源于stack exchange,提问作者user12038051
相关产品推荐
相关产品推荐

