在保持其顺序的同时删除列表中的重复项(Python)

TIM*_*MEX 21 python list

这实际上是这个问题的延伸.删除重复项后,该问题的答案没有保留列表的"顺序".如何在列表中删除这些重复项(python)

biglist = 

[ 

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

]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,应该删除第二个元素,因为先前的"u2.com"元素已经存在.但是,应该保留订单.

ega*_*fni 32

使用set(),然后使用原始列表的索引重新排序.

>>> mylist = ['c','a','a','b','a','b','c']
>>> sorted(set(mylist), key=lambda x: mylist.index(x))
['c', 'a', 'b']
Run Code Online (Sandbox Code Playgroud)

  • 更糟糕的是,它为每个不同的元素调用“.index”,这会执行线性搜索,因此这是一个不需要的 O(n^2)。 (3认同)
  • 整洁的 Python 代码。缺点是它会导致额外的排序,因此不需要 O(n * log(n)) (否则 O(n) 就足够了)。 (2认同)

Ale*_*lli 25

我对你完全忽略的另一个问题的答案,表明你声称这是错误的

这个问题的答案没有保持"秩序"

  • 我的回答确实保持秩序,它明确表示确实如此.在这里再次强调,看看你是否可以继续忽略它......:

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

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
Run Code Online (Sandbox Code Playgroud)

  • 嘿Alex,出于好奇,你为什么把[:]放在任务的左边?我经常在RHS上看到它.这只是个人偏好吗?哈哈,开始看它,我甚至不确定它会做什么. (3认同)
  • @xitrium使用左边的`[:]`替换列表中的所有项目,而不是列表本身.它可能会产生影响,例如,如果您在传入列表的函数内执行此操作:如果您*更改*列表,则在函数外部更改它,如果您*替换*它,则外部列表不受影响).在这种特殊情况下,我看不到可观察到的影响. (3认同)

Joc*_*zel 9

发电机很棒.

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

biglist[:] = unique( biglist )
Run Code Online (Sandbox Code Playgroud)