我从存储的文本文件中输入了大约2-5百万个字符串,每个字符串约400个字符。 在将重复项添加到我要检查的列表之前,我需要检查重复项(不必是列表,可以是任何其他数据类型,从技术上讲,列表是一组,因为所有项都是唯一的。)
我可以预期最大数据量中约有0.01%是不唯一的,我需要将它们过滤掉。
我想知道是否有更快的方法可以检查项目是否存在于列表中,而不是:
a=[]
for item in data:
if item not in a:
a.add(item)
我不想失去订单。
散列会更快(我不需要加密)吗?但随后,我必须维护一个哈希表,以首先检查所有值。 我有什么想念的吗?
我使用的是python 2,最多可以使用python 3.5。
答案 0 :(得分:2)
很难回答这个问题,因为它一直在变化;-)我正在回答的版本询问是否有比以下方法更快的方法:
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中的语言保证还是通过OrderedDict
包中的collections
类型进行排序)。不过,上面的代码是内存效率最高的。
答案 1 :(得分:-1)
您可以尝试一下,
a = list(set(data))
列表是元素的有序序列,而集合是元素的无序列表。