如何解决查找出现在一个列表中但不在另一个列表中的元素反之亦然
aList = [1,2]
bList = [2,3]
aList = [i for i in aList if i not in bList ]
bList = [i for i in bList if i not in aList ]
print(aList)
print(bList)
我预计 aList
和 bList
的结果是 [1]
和 [3]
,但结果是 [1]
和 [2,3]
。
我以为 i
中的 aList
会在 aList
生成后消失,我可以在 i
中使用 bList
。
i
中的 aList
如何影响 i
中的 bList
?
解决方法
这是因为当您执行 aList = [i for i in aList if i not in bList ]
时,您将 aList
的内容从 [1,2]
替换为 [1]
。
因此,bList
最终同时持有 [2,3]
,因为您的 aList
在执行 [1]
时只是 bList = [i for i in bList if i not in aList ]
。
为了使您的逻辑正常工作,您可以将 aList
和 bList
存储在不同的变量中。例如:
aList = [1,2]
bList = [2,3]
aListCopy = [i for i in aList if i not in bList ]
bListCopy = [i for i in bList if i not in aList ]
print(aListCopy) # prints: [1]
print(bListCopy) # prints: [3]
但是,对于您的用例,最好使用 set()
来查找存在于一个列表中但不在另一个列表中的元素。例如:
# Returns elements present in `aList` but not in `bList`
>>> set(aList) - set(bList)
set([1])
# Returns elements present in `bList` but not in `aList`
>>> set(bList) - set(aList)
set([3])
有关详细信息,请参阅 set()
documentation。
程序一步一步执行。声明:
aList = [i for i in aList if i not in bList ]
将 aList
的原始值从 [1,2]
替换为 [1]
。然后,当控制到达这个语句时:
bList = [i for i in bList if i not in aList ]
状态是:
bList = [i for i in [2,3] if i not in [1] ]
它解释了你的输出。
bList = [2,3]
有一种方法可以解决这个问题,使用元组赋值:
aList,bList = [i for i in aList if i not in bList ],[i for i in bList if i not in aList ]
只有在评估了所有右侧表达式后,才会更新左侧的所有值。
现在你有:
aList = [1]
bList = [3]
此外,两个列表推导式中 i
的作用域仅在推导式 ([]
) 内。
问题在于您正在重用变量 aList
。在第 3 行使用不同的名称。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。