如何根据2个键删除重复的词典?

时间:2016-01-25 10:19:54

标签: python

我想基于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分钟来处理。有没有更有效的方法来做到这一点?

1 个答案:

答案 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