从字典列表中删除具有相同ID的字典

时间:2019-11-18 16:12:03

标签: python python-3.x list dictionary nested

我要从具有相同ID的字典中​​删除。

def removeDuplicate(elems, id):
    new_list = []
    for elem in elems:
        if not elem[id] in [d[id] for d in new_list if id in d]:
            new_list.append(elem)
    return new_list


a = [
    {0 : 'a', 'id' : 2, 2 : 'c', time : '1'},
    {0 : 'a', 'id' : 2, 2 : 'c', time : '2'},
    {0 : 'a', 'id' : 3, 2 : 'c', time : '3'},
    {0 : 'a', 'id' : 4, 2 : 'c', time : '4'},
    {0 : 'a', 'id' : 5, 2 : 'c', time : '5'},
    {0 : 'a', 'id' : 4, 2 : 'c', time : '6'},
    {0 : 'a', 'id' : 2, 2 : 'c', time : '7'},
    {0 : 'a', 'id' : 3, 2 : 'c', time : '8'},
]
print(a)

a = removeDuplicate(a, 'id')

print(a)

对于7000个元素来说还可以,但是对于500 000个元素来说却要花费很多时间。

是否有更好的方法来删除这些出现的内容?

4 个答案:

答案 0 :(得分:3)

在进行查找时尝试使用set,因为它的复杂度仅为O(1)。另外,在不需要时尝试不循环。

您的代码经过稍加修改后,即使是50万个元素也应该足够快

def removeDuplicate(elems, id):
    new_list = []
    read_ids = set()
    for elem in elems:
        if elem[id] not in read_ids:
            read_ids.add(elem[id])
            new_list.append(elem)
    return new_list

答案 1 :(得分:3)

您的代码的复杂度为O(n ^ 2)(甚至更糟)。您一直在new_list上进行重新创建和重复。

只需对您已经看到的所有ID进行一组设置。 in中的set检查是O(1)操作。

def removeDuplicate(elems, id):
    seen_ids = set()
    new_list = []
    for elem in elems:
        if elem[id] not in seen_ids:
            new_list.append(elem)
            seen_ids.add(elem[id])
    return new_list


a = [
    {0 : 'a', 'id' : 2, 2 : 'c', time : '1'},
    {0 : 'a', 'id' : 2, 2 : 'c', time : '2'},
    {0 : 'a', 'id' : 3, 2 : 'c', time : '3'},
    {0 : 'a', 'id' : 4, 2 : 'c', time : '4'},
    {0 : 'a', 'id' : 5, 2 : 'c', time : '5'},
    {0 : 'a', 'id' : 4, 2 : 'c', time : '6'},
    {0 : 'a', 'id' : 2, 2 : 'c', time : '7'},
    {0 : 'a', 'id' : 3, 2 : 'c', time : '8'},
]
print(a)

a = removeDuplicate(a, 'id')

print(a)

答案 2 :(得分:1)

请不要命名参数/变量id,它是内置的(https://docs.python.org/3/library/functions.html#id)。

def remove_duplicate(elems, k):
    new_list = []
    seen_keys = set()
    for elem in elems:
        if elem[k] not in seen_keys:
            new_list.append(elem)
            seen_keys.add(k)
    return new_list

答案 3 :(得分:0)

您可以:


def removeDuplicate(elems, id):
    new_list = []
    ids = {e[id] for e in elems}
    for elem in elems:
        if elem[id] in ids:
            new_list.append(elem)
            ids.remove(elem[id])
    return new_list