如何在不等长列表中匹配元素并返回对应行标识
问题与解决方案
问题描述
我有两个嵌套列表:
df1:无行标识,每个子列表包含一组待匹配元素df2:每个子列表的首个元素为行标识,后续元素是匹配内容
需要实现:遍历df1中每个元素,找到该元素在df2任意子列表(排除行标识列)中出现的所有行,返回对应的行标识,结果结构与df1完全对应。
示例输入
df1 = [[2,4,6,8,9,10],[10,13,15,17,26,44],[27,28,34,37,40]] df2 = [[120,1,2,4,5,6,8],[20,5,6,20,22,23,34],[132,8,12,13,34,45,46],[56,9,10,14,29,32,33],[29,1,22,13,23,33,35],[167,1,6,7,8,9,10],[15,0,2,3,5,6,8]]
期望输出
result = [[[120,120,120,120],[20,],[132],[56],[56],[167,167,167,167,],[15,15,15]],[[132],[56],[29],[167]],[[20],[132]]]
解决方案
用Python实现,先构建元素到行标识的映射字典提升查找效率,再生成对应结果:
# 构建元素到行标识的映射(自动去重同一行的重复元素) element_to_ids = {} for row in df2: row_id = row[0] # 对当前行的元素去重,避免同一行多次添加相同行标识 unique_elements = set(row[1:]) for elem in unique_elements: if elem not in element_to_ids: element_to_ids[elem] = [] element_to_ids[elem].append(row_id) # 生成与df1结构对应的结果 result = [] for sublist in df1: current_sub_result = [] for elem in sublist: # 若元素无匹配则返回空列表 current_sub_result.append(element_to_ids.get(elem, [])) result.append(current_sub_result) print(result)
代码说明
映射字典构建:
- 遍历
df2每一行,提取行标识和该行的元素集合(去重) - 将每个元素与对应的行标识绑定,后续查找只需直接取值,大幅提升效率
- 遍历
结果生成:
- 完全复刻
df1的嵌套结构,每个元素对应其在df2中匹配到的所有行标识列表 - 使用
get方法处理无匹配元素的情况,返回空列表保证结构一致性
- 完全复刻
内容的提问来源于stack exchange,提问作者user20250014
相关产品推荐
相关产品推荐

