我要从具有相同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个元素来说却要花费很多时间。
是否有更好的方法来删除这些出现的内容?
答案 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