Python查找第一个嵌套列表中不在第二个列表的元素并追加到l2
代码问题定位
你的代码逻辑错误出在成员判断环节:
l2是两层嵌套列表,直接使用元素 not in l2做判断时,Python只会检查该元素是否等于l2最外层的某一个子列表,不会深入子列表内部检查单个值是否存在。- 举个例子,判断数字
2是否在l2中时,代码只会把2和[1,8,10]、[3,9]、[5,6]这三个顶层子列表做相等比较,结果必然是不相等,根本不会检查子列表内部是否包含2,最终判断结果完全偏离预期。 - 运行你写的原代码,得到的
ls会是[1,2,3,5,6,7,8,9,10]——因为所有单个数字都不可能和l2里的任何一个子列表相等,自然全部被判定为“不存在于l2”。
修正后代码
正确的思路是先把l2所有子列表里的元素汇总成一个可快速查询的集合,再遍历l1做存在性校验,代码如下:
l1 = [[1,2,3],[5,6],[7,8,9,10]] l2 = [[1,8,10],[3,9],[5,6]] ls = [] # 汇总l2中所有已存在的元素 exists = set() for sub in l2: exists.update(sub) # 遍历l1收集不存在的元素 for sub in l1: for num in sub: if num not in exists and num not in ls: ls.append(num) l2.append(ls) print(l2)
运行上述代码会输出[[1, 8, 10], [3, 9], [5, 6], [2, 7]],完全匹配你的预期结果。
优化提示:使用集合做成员判断的时间复杂度为O(1),比直接遍历列表判断的O(n)效率高很多,数据量越大优势越明显。
内容的提问来源于stack exchange,提问作者roger montez
相关产品推荐
相关产品推荐

