在列表中去重并保持顺序(Python)

27 投票
9 回答
26425 浏览
提问于 2025-04-15 14:59

这实际上是对这个问题的进一步讨论。之前那个问题的答案在去掉重复项后,没有保持列表的“顺序”。 如何在列表中去掉这些重复项(python)

biglist = 

[ 

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

]

在这种情况下,第二个元素应该被去掉,因为之前已经有一个“u2.com”的元素了。不过,列表的顺序应该保持不变。

9 个回答

13

生成器真是太棒了。

def unique( seq ):
    seen = set()
    for item in seq:
        if item not in seen:
            seen.add( item )
            yield item

biglist[:] = unique( biglist )
39

先用 set() 去掉重复的元素,然后再根据原始列表的顺序重新排序。

>>> mylist = ['c','a','a','b','a','b','c']
>>> sorted(set(mylist), key=lambda x: mylist.index(x))
['c', 'a', 'b']
26

我之前对你另一个问题的回答,你完全不理会!这说明你在说这句话的时候是错的:

那个问题的答案没有保持“顺序”

  • 我的回答保持了顺序,而且它很清楚地说明了这一点。这里再给你看看,特别强调一下,看看你还能不能继续忽视它...:

如果你想保持剩下项目的确切顺序,处理一个非常大的列表,可能最快的方法是:

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

撰写回答