[英]How to remove these duplicates in a list (python)
biglist =
[
{'title':'U2 Band','link':'u2.com'},
{'title':'ABC Station','link':'abc.com'},
{'title':'Live Concert by U2','link':'u2.com'}
]
我想删除列表中的THIRD元素...因为它具有重复的“ u2.com”。 我不想重复的“链接”元素。 这样做最有效的代码是什么:
biglist =
[
{'title':'U2','link':'u2.com'},
{'title':'ABC','link':'abc.com'}
]
我尝试了许多方法,包括使用许多嵌套的“ for ... in ....”,但这效率很低而且太长。
对于一个很大的列表,如果您想保留剩余项目的确切顺序,可能是最快的方法如下:
biglist = [
{'title':'U2 Band','link':'u2.com'},
{'title':'ABC Station','link':'abc.com'},
{'title':'Live Concert by U2','link':'u2.com'}
]
known_links = set()
newlist = []
for d in biglist:
link = d['link']
if link in known_links: continue
newlist.append(d)
known_links.add(link)
biglist[:] = newlist
制作一个新字典,用'u2.com'和'abc.com'作为键,并使用列表元素作为值。 字典将强制唯一性。 像这样:
uniquelist = dict((element['link'], element) for element in reversed(biglist))
(存在相反的内容,因此列表中的第一个元素将是保留在字典中的元素。如果将其删除,则将获得最后一个元素)。
然后,您可以将元素重新放入这样的列表中:
biglist = uniquelist.values()
您可以使用每个字典的link
字段作为排序关键字对列表进行排序,然后遍历列表一次并删除重复项(或者,如Python习惯用法一样,创建一个删除重复项的新列表),如下所示:
# sort the list using the 'link' item as the sort key
biglist.sort(key=lambda elt: elt['link'])
newbiglist = []
for item in biglist:
if newbiglist == [] or item['link'] != newbiglist[-1]['link']:
newbiglist.append(item)
这段代码将为您提供任何“重复项”组的第一个元素(原始biglist
中的相对顺序)。 之所以如此,是因为Python使用的.sort()
算法保证是稳定的排序-它不会更改确定为彼此相等的元素的顺序(在这种情况下,元素具有相同的link
)。
biglist = \
[
{'title':'U2 Band','link':'u2.com'},
{'title':'ABC Station','link':'abc.com'},
{'title':'Live Concert by U2','link':'u2.com'}
]
def dedupe(lst):
d = {}
for x in lst:
link = x["link"]
if link in d:
continue
d[link] = x
return d.values()
lst = dedupe(biglist)
dedupe()保留所有重复项中的第一个。
您可以使用defaultdict
按link
对项目进行分组,然后根据需要删除重复项。
from collections import defaultdict
nodupes = defaultdict(list)
for d in biglist:
nodupes[d['url']].append(d['title']
这将为您提供:
defaultdict(<type 'list'>, {'abc.com': ['ABC Station'], 'u2.com': ['U2 Band',
'Live Concert by U2']})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.