首页 > 解决方案 > 在查找两个列表的公共部分的列表理解中使用 pop 有什么用?

问题描述

我是 python 的初学者,发现了这个列表理解

l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)]

回答有关如何在两个列表中找到共同元素的问题(问题:两个列表之间的共同元素比较)。

零件有什么l2.pop作用?是否只是检查元素是否存在或者删除部分是否也pop()很重要?先感谢您

标签: pythonlistlist-comprehension

解决方案


正如上面@user202729 所提到的,这段代码代表了一种应该避免的做法,因为它l2在列表理解中修改了一个可变对象(列表)并使用了这种修改的副作用。编写这样的代码很容易出错,而且可能很难发现这些错误。

在任何情况下,目标都是创建一个列表,其中包含和common共有的元素。此外,如果某个元素在两个列表中出现 n 次,那么它将在 中列出 n 次。l1l2common

该代码使用了 Python 懒惰地评估逻辑表达式的事实。在条件

if e in l2 and ((l2.pop(l2.index(e)) or True)

e in l2首先评估第一部分。如果它给出Falseie 的元素不在 中e,则后面的部分不执行,不包含在 中,列表推导继续到 的下一个元素。l1l2andecommonl1

另一方面,如果e in l2评估为True,则评估之后的部分and。这部分的值总是True(由于or True位),因此e成为 的元素common。但是,Python 首先运行它会从 listl2.pop(l2.index(e))中删除一次出现的元素。出于这个原因,如果迭代再次遇到列表中的相同元素,那么只有当它出现多次时,才会第二次包含该元素。el2el1commonl2


推荐阅读