Python循环转列表推导式求列表交集返回空列表的错误排查
错误原因
你写的列表推导式的核心问题出在赋值逻辑上:
- 列表推导式会先完成内部所有元素的迭代、筛选,生成完整的新列表后,才会把最终结果赋值给左侧的
new_list变量。 - 推导式运行的整个过程中,你在条件里引用的
new_list,是这行赋值语句执行前就已经存在的旧值,不是你正在生成的新列表。
如果运行这行代码前你没有预先定义过new_list,会直接抛出NameError;如果你预先把new_list初始化为空列表,推导式里的a not in new_list判断永远是针对旧的空列表生效,不仅没法实现去重逻辑,还可能因为你之前给new_list赋过其他值导致返回结果为空。
替代写法
最优方案(推荐)
找两个列表的去重交集直接用集合操作即可,时间复杂度远低于嵌套循环:
new_list = list(set(list_one) & set(list_two))
列表推导式实现
如果一定要用列表推导式实现和你普通循环完全一致的逻辑(保留list_one中交集元素的出现顺序、且去重),可以写成:
new_list = [a for idx, a in enumerate(list_one) if a in list_two and a not in list_one[:idx]]
这个写法不需要引用正在生成的new_list,靠判断元素是否是在list_one中第一次出现来实现去重。
内容的提问来源于stack exchange,提问作者DillonB07
相关产品推荐
相关产品推荐

