嵌套列表多索引匹配:将data2的vid映射到data1并避免重复
解决方案
核心思路
把data2按前三个元素分组,存储为**(前三个元素元组): [可用vid列表]**的结构,每次匹配时从对应组的vid列表中按顺序取出一个使用,用完后放回列表末尾,实现循环复用。
代码实现
# 示例数据 data1 = [ ['a', 'b', 'c', 'info1'], ['a', 'b', 'c', 'info2'], ['d', 'e', 'f', 'info3'], ['x', 'y', 'z', 'info4'], ['a', 'b', 'c', 'info5'] ] data2 = [ ['a', 'b', 'c', 'vid1'], ['a', 'b', 'c', 'vid2'], ['d', 'e', 'f', 'vid3'], ['a', 'b', 'c', 'vid4'] ] # 预处理data2:按前三个元素分组,存储可用vid列表 vid_groups = {} for item in data2: key = tuple(item[:3]) if key not in vid_groups: vid_groups[key] = [] vid_groups[key].append(item[-1]) # 处理data1 for sublist in data1: key = tuple(sublist[:3]) if key in vid_groups and vid_groups[key]: # 取出当前组的第一个vid,放回末尾实现循环复用 vid = vid_groups[key].pop(0) vid_groups[key].append(vid) sublist.append(vid) else: sublist.append('false') # 输出结果 for item in data1: print(item)
代码说明
- 预处理data2:遍历data2的每个子列表,用前三个元素组成的元组作为键,把对应的vid添加到该键的列表中,同一匹配组的所有vid会被集中存储。
- 处理data1:
- 提取每个子列表的前三个元素作为匹配键;
- 若键存在且对应vid列表不为空,取出列表首个vid后放回末尾,保证后续还能复用该vid;
- 无匹配项时,直接添加
'false'。
效果验证
运行代码后,data1的输出结果为:
['a', 'b', 'c', 'info1', 'vid1'] ['a', 'b', 'c', 'info2', 'vid2'] ['d', 'e', 'f', 'info3', 'vid3'] ['x', 'y', 'z', 'info4', 'false'] ['a', 'b', 'c', 'info5', 'vid4']
如果继续添加['a','b','c']的子列表,会循环使用vid1、vid2、vid4。
内容的提问来源于stack exchange,提问作者Yogyakartas
相关产品推荐
相关产品推荐

