我想基于2个键删除重复的词典。有更快的方法吗?
我到目前为止所做的尝试。
def remove_duplicates(documents):
unique_documents = [documents[0]] # Initialize first dict
for document in documents:
for index, unique_document in enumerate(unique_documents):
if unique_document['user'] == document['user']:
if unique_document['text'] == document['text']:
# If the user and text are found, then it's a duplicate.
# Go to next document.
break
if index == len(unique_documents)-1:
# If it reaches the last dict of the unique_documents,
# append to list because the dict is unique
unique_documents.append(document)
return unique_documents
在dicts列表中每个dict有7个键,并使用上面的代码和 99942 文档的测试数据 1457.94099998s 或者 24分钟来处理。有没有更有效的方法来做到这一点?
答案 0 :(得分:3)
在最糟糕的情况下,您的方法需要O(N ** 2)时间(所有文档都是唯一的,您可以遍历测试的每个文档的所有独特文档)。
使用单独的集合来跟踪您已经看过的用户文本元组,这样您就可以将其减少为O(N)算法,而与唯一文档的数量无关。集允许您在O(1)时间内测试对象的存在,从而无需嵌套循环:
def remove_duplicates(documents):
unique_documents = []
seen = set()
for document in documents:
if (document['user'], document['text']) in seen:
continue
unique_documents.append(document)
seen.add((document['user'], document['text']))
return unique_documents