如何在两个二维列表中提取对应行的不匹配元素并整理结果?
问题:二维列表逐行匹配并提取不匹配值
需求说明
我有两个行数较多、长度不同的二维列表df1和df2,需要针对df1的每一行,找出它与df2每一行的不匹配元素,只返回df2中的不匹配值。比如df1[0]和df2[0]匹配1、3、5时,返回[17];df1[0]和df2[1]无匹配则返回空列表。
尝试过的代码
no_matches = [] for sublist1 in df1: for sublist2 in df2: no_match = [val for val in sublist2 if val not in sublist1] if no_match: no_matches.append(no_match) print("no matches:", no_matches)
示例数据
df1 = [[1, 7, 3, 5], [2, 5, 14, 10]] df2 = [[1, 17, 3, 5], [34, 14, 74], [34, 3, 87], [25, 14, 10]]
预期结果
第一步:三维列表形式
no_match = 0: [[17], [], [34,87], []] 1: [[1,3,17], [34,74], [], [25]]
第二步:不含空列表的二维列表
no_match = [[17],[34,87],[1,3,17],[34,74],[25]]
解决方案
1. 生成包含空列表的三维结果
要得到预期的三维结构,需要为df1的每一行单独保存对应df2所有行的匹配结果,不能直接过滤空列表:
# 生成三维列表(保留空列表) no_matches_3d = [] for sublist1 in df1: row_result = [] for sublist2 in df2: # 提取df2中不在df1当前行的元素 diff = [val for val in sublist2 if val not in sublist1] row_result.append(diff) no_matches_3d.append(row_result) # 按预期格式打印三维结果 for idx, res in enumerate(no_matches_3d): print(f"no_match = {idx}: {res}")
运行输出:
no_match = 0: [[17], [], [34, 87], []] no_match = 1: [[1, 3, 17], [34, 74], [], [25]]
2. 转换为不含空列表的二维列表
遍历三维列表,收集所有非空的子列表即可:
# 转换为不含空列表的二维列表 no_matches_2d = [] for row in no_matches_3d: for sublist in row: if sublist: no_matches_2d.append(sublist) print("最终结果:", no_matches_2d)
运行输出:
最终结果: [[17], [34, 87], [1, 3, 17], [34, 74], [25]]
3. 大数据量优化方案
如果列表行数极多,用val not in sublist1的效率较低(列表in操作是O(n)复杂度),可以把df1的每一行转为集合,将in操作降为O(1):
# 优化版:用集合提升匹配速度 no_matches_3d = [] for sublist1 in df1: set1 = set(sublist1) row_result = [] for sublist2 in df2: diff = [val for val in sublist2 if val not in set1] row_result.append(diff) no_matches_3d.append(row_result) # 一行代码完成二维列表转换 no_matches_2d = [sublist for row in no_matches_3d for sublist in row if sublist]
内容的提问来源于stack exchange,提问作者user20250014
相关产品推荐
相关产品推荐

