![](/img/trans.png)
[英]Fastest way in Python to find a 'startswith' substring in a long sorted list of strings
[英]Python: Fastest way to search if long string is in list of strings
我从存储的文本文件中输入了大约2-5百万个字符串,每个字符串约400个字符。 在将重复项添加到我要检查的列表之前,我需要检查重复项(不必是列表,可以是任何其他数据类型,从技术上讲,列表是一组,因为所有项都是唯一的)。
我可以预期最大数据量中约有0.01%是不唯一的,因此需要过滤掉它们。
我想知道是否有更快的方法可以检查项目是否存在于列表中,而不是:
a=[]
for item in data:
if item not in a:
a.add(item)
我不想失去订单。
哈希会更快(我不需要加密)吗? 但随后,我必须维护一个哈希表,以首先检查所有值。 有什么我想念的吗?
我在python 2上,最大可以增加到python 3.5。
这个问题很难回答,因为它一直在变化;-)我正在回答的版本询问是否有比以下方法更快的方法:
a=[]
for item in data:
if item not in a:
a.add(item)
这将非常慢,花费len(data)
时间是二次方。 在任何版本的Python中,以下代码都会在len(data)
采用预期情况下的线性时间:
seen = set()
for item in data:
if item not in seen:
seen.add(item)
emit(item)
其中的emit()
执行您喜欢的任何操作(附加到列表,写入文件等)。
在注释中,我已经指出了使用有序字典来实现相同目的的方法(无论是通过Python 3.7中的语言保证还是通过collections
包中的OrderedDict
类型进行排序)。 不过,上面的代码是最节省内存的。
你可以试试看
a = list(set(data))
列表是元素的有序序列,而集合是元素的无序列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.