我想知道因为我需要有一个令人厌恶的功能,检查一个单词是否在字典列表中 - 我正在考虑将字典保留为一个大字符串并反而运行正则表达式。这需要非常快。所以我只需要一个基本的概述如何 python处理检查一个字符串是否在一个字符串列表中,以及它是否超出合理的速度。
答案 0 :(得分:10)
如果你想要一个超快的成员资格测试,那么列表是错误的数据结构。请查看listobject.c
, line 437中list_contains
的实施情况。它按顺序迭代列表,依次将项目与每个元素进行比较。项目出现在列表中的时间越晚,查找项目所需的时间越长,如果项目丢失,则必须扫描整个列表。
请改用set。集合由散列表在内部实现,因此查找对象涉及计算其散列,然后扫描一些表条目(通常只有一个)。有关查找字符串的特定情况,请参阅setobject.c
, line 156中的set_lookkey_string
。
答案 1 :(得分:4)
一组字符串将具有O(1)查找时间:无论集合的大小如何,都有效。从字符串列表中创建一个集很容易:
my_set = set(my_list)
if my_word in my_set:
print "it's there!"
答案 2 :(得分:2)
如果您需要真正的快速检查,请使用set
:
words = set(words_list)
if "hello" in words:
print("hello found!"")
一个集合更快,因为它使用hash-algorithm而不是直接搜索方法。
答案 3 :(得分:2)
根据this site,x in s
是O(n)。因此,它检查每个条目(在最坏的情况下)。
无论如何,请不要使用正则表达式。使用集合或列表是一种更直观的方式来表示数据,并且正则表达式的性能不会比O(n)更好。
答案 4 :(得分:1)
如果您使用的是常规列表,请考虑使用set
。
如果您想为容器对象实施自己的微调成员资格测试,请覆盖__contains__
。
答案 5 :(得分:0)
如果你担心时间,你可能想要使用Set。集合很像列表,但它会根据散列检查成员资格。
答案 6 :(得分:0)
使用一套。 如果您需要不区分大小写的检查,只需将单词存储到集合中。然后,在检查集合中是否存在某个单词时,在检查成员资格之前将该单词缩写。
一般规则是:在构建集合时规范化条目,并在检查集合之前规范化项目。标准化的另一个例子是将连续的空格字符折叠到一个空格中并剥离前导/尾随空格。
答案 7 :(得分:0)
对你的单词列表运行正则表达式是一个非常糟糕的主意;它的鳞片非常严重。
使用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