如何在列表中删除这些重复项(python)

时间:2009-10-07 23:15:44

标签: python list

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 ....”但这种效率非常低且太长。

5 个答案:

答案 0 :(得分:8)

对于一个非常大的列表,如果你想保留剩余物品的确切顺序,可能是最快的方法,如下......:

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

答案 1 :(得分:3)

制作一个新词典,将'u2.com'和'abc.com'作为键,将列表元素作为值。字典将强制执行唯一性。像这样:

uniquelist = dict((element['link'], element) for element in reversed(biglist))

(反之亦然,列表中的第一个元素将保留在字典中。如果你把它拿出来,那么你将得到最后一个元素。)

然后你可以将元素重新放回到这样的列表中:

biglist = uniquelist.values()

答案 2 :(得分:2)

您可以使用每个字典的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()算法保证是一个稳定的排序 - 它不会改变被确定为彼此相等的元素的顺序(在这种情况下,具有相同{{1}的元素}})。

答案 3 :(得分:1)

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)

重复数据删除()保留任何重复的第一个。

答案 4 :(得分:0)

您可以使用defaultdictlink对项目进行分组,然后根据需要删除重复项。

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']})