只保留列表中第一个出现的元素



如何删除列表中最后一个重复的Element。

例如:a = [1,2,4,5,1,3,5,6]

我尝试删除元素#6和元素#4。但我只能删除#1和#4。

是否也可以删除索引高于第一个索引的所有重复项?例如a = [ 1,2,1,3,1,4,5]-->删除#2、#4

使用panda,您可以删除重复项并传入参数以保留第一个或最后一个实例,然后将其转换为列表:

import pandas as pd
a = [1,2,4,5,1,3,5,6]
df = pd.DataFrame(a, columns=['a'])
a_keep_first = list(df.drop_duplicates(keep="first")['a'])
print (a_keep_first)
# output: [1, 2, 4, 5, 3, 6]

a_keep_last = list(df.drop_duplicates(keep="last")['a'])
print (a_keep_last)
# output: [2, 4, 1, 3, 5, 6]

但是,这是假设您不希望重复。它提出了另一个问题,如果有两个以上的重复,该怎么办?那么,如果你想删除最后一个重复(如果有3个重复(,这是否意味着你只剩下2个重复?

给定:a = [1,2,4,5,1,3,5,6,1]

你想要:a = [1,2,4,5,1,3,6]还是a = [1,2,4,5,3,6,]

这里有两种基本的方法。首先是利用集合的唯一性,但请注意,顺序没有保留。第二种方式维持秩序。

list_num = [1,2,1,3,1,4,5]
unique_set = set(); # sets don't allow duplicates
for n in list_num:
unique_set.add(n)    
unique_list_1 = list(unique_set)

unique_list_2 = []
for n in list_num:
if n not in unique_list_2:
unique_list_2.append(n)

从简单的迭代开始,如果您在之前看到了元素,请过滤掉

a=[1,2,4,5,1,3,5,6]
def removeDuplicates(listofElements):
uniqueList = []
for elem in listofElements:
if elem not in uniqueList:
uniqueList.append(elem)
return uniqueList
removeDuplicates(a)

显然,numpy没有什么困难,但它在这些问题上并不有效,而这些问题只能通过迭代来解决

from timeit import timeit
def use_numpy(a):
x, ix = np.unique(a, return_index=True)
np.array(a)[sorted(ix)].tolist()

以上代码取自@nixon 发布的答案

print(timeit('use_numpy(a)',setup='from __main__ import use_numpy; import numpy as np;a = [1,2,4,5,1,3,5,6]',number=1000000))
print(timeit('removeDuplicates(a)',setup='from __main__ import removeDuplicates; import numpy as np;a = [1,2,4,5,1,3,5,6]',number=1000000))

输出

14.6761189173  # numpy
1.08678438189  # for loop

最新更新