在查找两个列表的公共部分的列表推导中,pop 有什么用?
What is the use of pop in a list comprehension finding the common part of two lists?
我是 python 的初学者,发现了这个列表理解
l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)]
在 answer to a question about how to find the common elements in two lists(question: Common elements comparison between 2 lists 中)。
l2.pop
部分有什么作用?它只是检查元素是否存在,还是 pop()
的删除部分也很重要?提前谢谢你
正如上面@user202729 所提到的,这段代码代表了一种应该避免的做法,因为它修改了一个可变对象(列表l2
)在列表推导中的适当位置并使用了副作用这个修改。像这样编写代码很容易出错,而且可能很难发现这些错误。
无论如何,目标是创建一个列表 common
,其中包含 l1
和 l2
共有的元素。此外,如果某个元素在两个列表中都出现了 n 次,那么它将在 common
.
中列出 n 次
代码使用了 Python 延迟计算逻辑表达式的事实。
在条件
if e in l2 and ((l2.pop(l2.index(e)) or True)
首先评估第一部分 e in l2
。如果给出False
即l1
的元素e
不在l2
中,那么and
之后的部分不执行,e
是不包含在 common
中,列表理解移动到 l1
.
的下一个元素
另一方面,如果 e in l2
的计算结果为 True
,则 and
之后的部分将被计算。这部分的值总是True
(由于or True
位),所以e
成为common
的一个元素。但是,Python 首先运行 l2.pop(l2.index(e))
,它从列表 l2
中删除了一次元素 e
。由于这个原因,如果迭代再次遇到列表l1
中的相同元素e
,那么只有在[=11]中出现该元素才会第二次包含在common
中=] 也不止一次。
我是 python 的初学者,发现了这个列表理解
l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)]
在 answer to a question about how to find the common elements in two lists(question: Common elements comparison between 2 lists 中)。
l2.pop
部分有什么作用?它只是检查元素是否存在,还是 pop()
的删除部分也很重要?提前谢谢你
正如上面@user202729 所提到的,这段代码代表了一种应该避免的做法,因为它修改了一个可变对象(列表l2
)在列表推导中的适当位置并使用了副作用这个修改。像这样编写代码很容易出错,而且可能很难发现这些错误。
无论如何,目标是创建一个列表 common
,其中包含 l1
和 l2
共有的元素。此外,如果某个元素在两个列表中都出现了 n 次,那么它将在 common
.
代码使用了 Python 延迟计算逻辑表达式的事实。 在条件
if e in l2 and ((l2.pop(l2.index(e)) or True)
首先评估第一部分 e in l2
。如果给出False
即l1
的元素e
不在l2
中,那么and
之后的部分不执行,e
是不包含在 common
中,列表理解移动到 l1
.
另一方面,如果 e in l2
的计算结果为 True
,则 and
之后的部分将被计算。这部分的值总是True
(由于or True
位),所以e
成为common
的一个元素。但是,Python 首先运行 l2.pop(l2.index(e))
,它从列表 l2
中删除了一次元素 e
。由于这个原因,如果迭代再次遇到列表l1
中的相同元素e
,那么只有在[=11]中出现该元素才会第二次包含在common
中=] 也不止一次。