python - 在查找两个列表的公共部分的列表理解中使用 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()
很重要?先感谢您
解决方案
正如上面@user202729 所提到的,这段代码代表了一种应该避免的做法,因为它l2
在列表理解中修改了一个可变对象(列表)并使用了这种修改的副作用。编写这样的代码很容易出错,而且可能很难发现这些错误。
在任何情况下,目标都是创建一个列表,其中包含和common
共有的元素。此外,如果某个元素在两个列表中出现 n 次,那么它将在 中列出 n 次。l1
l2
common
该代码使用了 Python 懒惰地评估逻辑表达式的事实。在条件
if e in l2 and ((l2.pop(l2.index(e)) or True)
e in l2
首先评估第一部分。如果它给出False
ie 的元素不在 中e
,则后面的部分不执行,不包含在 中,列表推导继续到 的下一个元素。l1
l2
and
e
common
l1
另一方面,如果e in l2
评估为True
,则评估之后的部分and
。这部分的值总是True
(由于or True
位),因此e
成为 的元素common
。但是,Python 首先运行它会从 listl2.pop(l2.index(e))
中删除一次出现的元素。出于这个原因,如果迭代再次遇到列表中的相同元素,那么只有当它出现多次时,才会第二次包含该元素。e
l2
e
l1
common
l2
推荐阅读
- android - 使用导航组件实现 BottomNavigationView 的后退按钮行为
- python - 在 Web 应用程序上运行经过训练的神经网络模型后释放内存
- django - 在视图函数 django 中使用会话时未存储会话
- java - IDE 特定的 SSL 握手异常
- bash - 使用给定日期获取那一年中的哪一天
- reactjs - Redux 操作中的不可序列化文件对象
- sql-server - 将本地 SQL Server 数据库同步到 Azure Windows Server SQL Server 的最佳方式是什么
- javascript - JavaScript Prompt() 出现两次
- javascript - 如何在 reactJS 中使用 onClick 为多个视频播放 HTML5 视频?
- ios - 如何从 API 读取带有空白根名称的 JSON 结果 - XCODE11 (Swift)