在列表中仅保留第一次出现的元素

时间:2018-12-14 13:55:11

标签: python

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

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

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

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

3 个答案:

答案 0 :(得分:0)

从简单的迭代开始,如果您之前看过元素,则进行过滤

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

答案 1 :(得分:0)

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

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,]吗?

答案 2 :(得分:0)

您可以通过两种基本方法来做到这一点。 首先是利用集合的唯一性,但是请注意,不保留顺序。 第二种方式维持秩序。

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)