首页 > 解决方案 > 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

我有两个问题:

  1. 为什么in在集合上比在列表上更快?
  2. 如果in操作符在集合上确实更快,那么 Python 的制造者为什么不重写in列表的方法x in set(list)呢?为什么这本书中的想法不能成为语言的一部分?

标签: python

解决方案


set使用哈希表来获得平均O(1)查找而不是O(n)使用列表查找,这就是为什么它更快,前提是元素是可哈希的(阅读更多:是什么让集合比列表更快?)。

现在在调用时将 a 转换list为 a需要将完整列表解析并转换为,因此在列表中搜索甚至更慢(即使元素位于列表的开头,转换也是在所有元素上完成的,所以没有短路)。setinset

没有魔法。将 alist转换为 aset很有用,但仅在初始化阶段,然后在set处理过程中多次进行查找。

但在这种情况下,直接创建一个set是最好的方法。


推荐阅读