不同索引长度嵌套列表匹配:提取对应关联字段
需求说明
我有两个嵌套列表:
data1 = [["tr1", 1000, 6798381], ["tr1", 1000, 6798381], ["tr2", 1200, 6798381], ["tr4", 1200, 6798381]] data2 = [["tr1", 1000, 6798381, "vid1"], ["tr1", 1000, 6798381, "vid2"], ["tr2", 1200, 6798381, "vid3"], ["tr3", 1200, 6798381, "vid4"]] data2_but_same_index = [["tr1", 1000, 6798381], ["tr1", 1000, 6798381], ["tr2", 1200, 6798381], ["tr3", 1200, 6798381]]
我需要仅对比两个列表子元素的前3个索引值,匹配成功时获取data2对应子列表的第4个索引元素(如vid1、vid2等)。
当对比索引长度相同的data1和data2_but_same_index时,我用以下代码实现了匹配判断:
data1 = [["tr1", 1000, 6798381], ["tr1", 1000, 6798381], ["tr2", 1200, 6798381], ["tr4", 1200, 6798381]] data2 = [["tr1", 1000, 6798381, "vid1"], ["tr1", 1000, 6798381, "vid2"], ["tr2", 1200, 6798381, "vid3"], ["tr3", 1200, 6798381, "vid4"]] data2_but_same_index = [["tr1", 1000, 6798381], ["tr1", 1000, 6798381], ["tr2", 1200, 6798381], ["tr3", 1200, 6798381]] for x in data1 : if x in data2_but_same_index : print("true") else : print("false")
输出结果:
true true true false
我希望用类似逻辑对比data1和data2,匹配成功时返回data2对应子列表的第4个索引元素(vid1/vid2/vid3/vid4)。
更新后的data1数据
data1 = [["tr3", 1200, 6798381], ["tr1", 1001, 6798381],["tr1", 1001, 6798381],["tr1", 1000, 6798381], ["tr1", 1000, 6798381], ["tr2", 1200, 6798381], ["tr4", 1200, 6798381]]
解决方案
可以先把data2转换成字典,键为子列表的前3个元素组成的元组(列表无法作为字典键,元组可以),值为对应的第4个元素。这种方式能实现O(1)的查找效率,比嵌套循环更高效。
代码实现:
data1 = [["tr3", 1200, 6798381], ["tr1", 1001, 6798381],["tr1", 1001, 6798381],["tr1", 1000, 6798381], ["tr1", 1000, 6798381], ["tr2", 1200, 6798381], ["tr4", 1200, 6798381]] data2 = [["tr1", 1000, 6798381, "vid1"], ["tr1", 1000, 6798381, "vid2"], ["tr2", 1200, 6798381, "vid3"], ["tr3", 1200, 6798381, "vid4"]] # 构建映射字典,处理重复键:若存在多个前3元素相同的子列表,保存所有对应vid vid_map = {} for item in data2: key = tuple(item[:3]) if key not in vid_map: vid_map[key] = [] vid_map[key].append(item[3]) # 遍历data1查找匹配项 for x in data1: key = tuple(x) if key in vid_map: print(vid_map[key]) # 若只需单个匹配vid,可改为print(vid_map[key][0]) else: print("false")
输出结果:
['vid4'] false false ['vid1', 'vid2'] ['vid1', 'vid2'] ['vid3'] false
若只需返回任意一个匹配的vid(如第一个),修改打印逻辑为print(vid_map[key][0])后,输出变为:
vid4 false false vid1 vid1 vid3 false
内容的提问来源于stack exchange,提问作者Yogyakartas
相关产品推荐
相关产品推荐

