菜鸟笔记
提升您的技术认知

Python中列表去重,保留原先顺序的八种方法

有道面试题: 将列表  L = [3, 1, 2, 1, 3, 4]去掉重复的元素,但保留原先顺序。 最后结果应该是:[3, 1, 2, 4]

如果不保留顺序的去重,很好处理,比如用set

>>> L = [3, 1, 4, 2, 3]
>>> list(set(L))
[1, 2, 3, 4]

如果要保留原先顺序不变,同样也有很多种方法:

方法一: 

>>> L = [3, 1, 2, 1, 3, 4]
>>> T = []
>>> for i in L:
...     if not i in T:
...         T.append(i)
>>> T
[3, 1, 2, 4]

方法二: 

>>> L = [3, 1, 2, 1, 3, 4]
>>> T = []
>>> [T.append(i) for i in L if not i in T ]
[None, None, None, None]

>>> T
[3, 1, 2, 4]

方法三:

>>> L = [3, 1, 2, 1, 3, 4]
>>> T = list(set(L))
>>> T
[1, 2, 3, 4]
>>> T.sort(key=L.index)
>>> T
[3, 1, 2, 4]

方法四:

>>> L = [3, 1, 2, 1, 3, 4]
>>> T = []
>>> for i,v in enumerate(L):
...     if L.index(v) == i:
...         T.append(v)
>>> T
[3, 1, 2, 4]

方法五: 

>>> L = [3, 1, 2, 1, 3, 4]
>>> T = {}.fromkeys(L).keys()
>>> T
[1, 2, 3, 4]

>>> T.sort(key=L.index)
>>> T
[3, 1, 2, 4]

方法六:

>>> L = [3, 1, 2, 1, 3, 4]
>>> T = L[:]
>>> for i in L:
...     while T.count(i) > 1:
...         del T[T.index(i)]
>>> T
[2, 1, 3, 4]

>>> T.sort(key=L.index)
>>> T
[3, 1, 2, 4]

方法七:

>>> L = [3, 1, 2, 1, 3, 4]
>>> T = sorted(set(L), key=L.index)
>>> T
[3, 1, 2, 4]

方法八:

>>> L = [3, 1, 2, 1, 3, 4]
>>> func = lambda L,i: L if i in L else L + [i]
>>> T = reduce(func, [[], ] + L)
>>> T
[3, 1, 2, 4]

备注: 

  • lambda L,i: L if i in L else L + [i]   # 如果元素在列表中,那么返回列表本身,不在的话L + [i]
  • [[], ] + L                                         # 等价于 [[], L],方便后面计算