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