在保留顺序和删除最旧元素的情况下,从Python列表中删除重复项的最有效方法

5

我在网站上看到了很多关于保留最老元素的去重解决方案。但我对相反的情况感兴趣:删除重复项时保留最新元素,例如:

list = ['1234','2345','3456','1234']
list.append('1234')
>>> ['1234','2345','3456','1234','1234']
list = unique(list)
>>> ['2345','3456','1234']

这样的东西是如何工作的?

谢谢。


1
尝试使用reversed()反转列表,然后按照其他地方描述的方式进行操作,最后再次反转它。 - eumiro
1
那么,你可以翻转列表,执行其他答案中提到的操作,然后再次翻转它。 - JoshD
1个回答

3

需要对项目(或键)进行散列处理,可以在类似于列表的数据结构中就地操作:

def inplace_unique_latest(L, key=None):
  if key is None:
    def key(x):
      return x
  seen = set()
  n = iter(xrange(len(L) - 1, -2, -1))
  for x in xrange(len(L) - 1, -1, -1):
    item = L[x]
    k = key(item)
    if k not in seen:
      seen.add(k)
      L[next(n)] = item
  L[:next(n) + 1] = []

1
我可能读错了,但是一旦你从列表中弹出,seen[x]不会变成错误的吗?因为所有东西都已经移动了,所以你最终会弹出错误的项? - bstpierre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接