【问题标题】:What is the use of pop in a list comprehension finding the common part of two lists?在列表推导中查找两个列表的公共部分的 pop 有什么用?
【发布时间】:2021-08-15 03:14:08
【问题描述】:

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

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

answer 中回答有关如何在两个列表中查找共同元素的问题(问题:Common elements comparison between 2 lists)。

l2.pop 部分有什么作用?是否只是为了检查元素是否存在或者pop() 的删除部分也很重要?提前谢谢你

【问题讨论】:

  • 链接答案使用的做法绝对是不好的做法...(尽管允许询问现有答案的工作原理)
  • if e in l2 and (l2.pop(l2.index(e)) or True)? or True?这总是正确的
  • @Sujay ...澄清一下,这不是 OP 自己编写的代码,他们在询问链接的其他 SO 答案如何工作。

标签: python list list-comprehension


【解决方案1】:

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

无论如何,目标是创建一个列表common,其中包含l1l2 共有的元素。此外,如果某个元素在两个列表中出现 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,那么只有在l2中出现多次时,该元素才会第二次包含在common中。

【讨论】:

  • 也太复杂了,可以用[l2.remove(e) or e for e in l1 if e in l2]
  • @KellyBundy。当然可以,或者[l2.pop(l2.index(e)) for e in l1 if e in l2]
  • 谢谢!只是为了澄清一下,从 pop 中返回实际上并没有做任何事情,并且任何从 l2 中删除 e 的函数实际上都可以做吗?
  • @fairykingoberon 是的,没有使用来自pop 的返回。您可以编写一个函数,从 l2 中删除一个元素并返回一个没有 True/False 值的对象,而这样的函数在这里不起作用。但除了这些人为的例子之外,任何函数都可以。
  • “这样的功能不起作用” - 为什么不呢?你能展示这样的功能吗?
猜你喜欢
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多