python - Python中集合和列表的“in”操作
问题描述
我有一本关于 Python 的书,上面写着:
in
是一个非常快速的集合操作:stopwords_list = ["a", "an"] + hundreds_of_other_words + ["yet", "you"] "zip" in stopwords_list # False, but have to check every element stopwords_set = set(stopwords_list) "zip" in stopwords_set # Very fast to check
我有两个问题:
- 为什么
in
在集合上比在列表上更快? - 如果
in
操作符在集合上确实更快,那么 Python 的制造者为什么不重写in
列表的方法x in set(list)
呢?为什么这本书中的想法不能成为语言的一部分?
解决方案
set
使用哈希表来获得平均O(1)
查找而不是O(n)
使用列表查找,这就是为什么它更快,前提是元素是可哈希的(阅读更多:是什么让集合比列表更快?)。
现在在调用时将 a 转换list
为 a需要将完整列表解析并转换为,因此在列表中搜索甚至更慢(即使元素位于列表的开头,转换也是在所有元素上完成的,所以没有短路)。set
in
set
没有魔法。将 alist
转换为 aset
很有用,但仅在初始化阶段,然后在set
处理过程中多次进行查找。
但在这种情况下,直接创建一个set
是最好的方法。
推荐阅读
- python - 检测数字中的重复项(Python)
- c# - 将 Dll 嵌入并加载到项目中 - VB.NET / C#
- javascript - 在孩子挂载之前设置一个使用 setState 的拦截器?
- javascript - 如果要插入的字符串中有来自 JavaScript 的变量,如何插入 AdjacentHTML?该字符串不采用 ${groupId} 的值
- node.js - 无法连接到 MongoDB Atlas(“使用 Mongoose”)
- c++ - 计算具有给定精度的序列的总和
- python - 查找元素是否在scrapy中
- unit-testing - 错误 Jest 在简单的 JS 测试中遇到了意外的令牌
- typescript - typescript + styled-components:将 BEM 应用于 styled-components
- r - 是否可以在 R 中创建具有中间停靠点(从 A 到 B 除外)的路线?