Python 如何处理检查'if object in list'



我想知道,因为我需要有一个函数,是令人厌恶的快速检查一个词是否在字典列表-我正在考虑离开字典作为一个大字符串和运行regex代替。这需要非常快。所以我只需要一个基本的概述 python如何处理检查字符串是否在字符串列表中,以及它是否超出了合理的速度。

如果您想要快速的成员测试,那么列表是错误的数据结构。看看listobject.clist_contains的实现,第437行。它按顺序遍历列表,依次将项与每个元素进行比较。项目在列表中出现得越晚,找到它所需的时间就越长,如果项目缺失,则必须扫描整个列表。

使用集合代替。集合是由哈希表在内部实现的,因此查找对象需要计算它的哈希值,然后扫描一些表项(通常只有一个)。对于查找字符串的特殊情况,请参见setobject.c中的set_lookkey_string,第156行。

字符串集的查找时间为0(1):无论集合的大小如何,它实际上都是恒定的。从字符串列表中创建一个集合很简单:

my_set = set(my_list)
if my_word in my_set:
    print "it's there!"

如果你需要真正快速的检查,使用set:

words = set(words_list)
if "hello" in words:
    print("hello found!"")

集合更快,因为它使用哈希算法,而不是直接搜索方法。

根据本网站,x in s为0 (n)。因此,它检查每个条目(在最坏的情况下)。

无论如何,不要使用正则表达式。使用集合或列表是一种更直观的表示数据的方式,而正则表达式的性能不会比0 (n)更好。

如果您使用的是常规列表,请考虑使用set

如果您想为您的容器对象实现您自己的微调成员测试,覆盖__contains__

如果担心时间问题,可能需要使用Set。Set很像list,但它是基于散列检查成员关系的。

使用一个集合。如果您需要不区分大小写的检查,只需将单词存储到集合中。然后,当检查某个词是否在集合中时,在检查隶属性之前将该词的小写。

一般规则是:在构建集合时对条目进行规范化,在检查集合之前对项进行规范化。规范化的另一个例子是将连续的空白字符折叠成单个空格,并剥离前导/尾随空白。

对单词列表运行正则表达式是一个非常糟糕的主意;它的规模非常糟糕。使用dict(), set()frozenset()会更好地扩展:

s = set(['one','two','three'])
'two' in s     ## true
b='four'
b in s         ## false
s.add('four')
b in s         ## true

最新更新