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

1 投票
5 回答
2490 浏览
提问于 2025-04-15 14:54
biglist = 

[ 

    {'title':'U2 Band','link':'u2.com'}, 
    {'title':'ABC Station','link':'abc.com'}, 
    {'title':'Live Concert by U2','link':'u2.com'} 

]

我想要删除列表中的第三个元素,因为它有一个重复的“u2.com”。我不想要重复的“链接”元素。有什么最有效的代码可以做到这一点,让结果变成这样:

biglist = 

[ 

    {'title':'U2','link':'u2.com'}, 
    {'title':'ABC','link':'abc.com'}
]

我试过很多方法,包括使用很多嵌套的“for ...in ...”,但是这样效率很低,而且代码太长了。

5 个回答

3

创建一个新的字典,使用 'u2.com' 和 'abc.com' 作为键,而你的列表元素作为值。这个字典会确保每个值都是唯一的。可以像这样做:

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

这里的反转是为了确保列表中的第一个元素会保留在字典中。如果你去掉这个反转,那么你得到的将是最后一个元素。

然后你可以像这样把元素重新放回列表:

biglist = uniquelist.values()
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
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() 算法是稳定的排序算法——它不会改变被认为是相等的元素的顺序(在这里,就是那些 link 相同的元素)。

撰写回答