Python 从列表中删除以前的重复项并保持顺序

Python 从列表中删除以前的重复项并保持顺序,python,list,duplicates,Python,List,Duplicates,我想定义一个函数,该函数将列表作为参数,并从列表中删除除最后一个之外的所有重复项 例如: 删除重复项([3,4,4,3,6,3])应该是[4,6,3]。答案并不能解决这个问题 该函数将删除列表中稍后存在的每个元素。 这是我的代码: def remove(y): for x in y: if y.count(x) > 1: y.remove(x) return y 对于此列表: [1,2,1,2,1,2,3]

我想定义一个函数,该函数将列表作为参数,并从列表中删除除最后一个之外的所有重复项

例如:
删除重复项([3,4,4,3,6,3])
应该是
[4,6,3]
。答案并不能解决这个问题

该函数将删除列表中稍后存在的每个元素。 这是我的代码:

def remove(y):
    for x in y:
        if y.count(x) > 1:
            y.remove(x)
            
    return y
对于此列表:
[1,2,1,2,1,2,3]
我得到以下输出:
[2,1,2,3]
。实际输出应该是
[1,2,3]
。 我哪里出了问题?如何解决它?

事实上回答了这个问题,但还有一个额外的步骤:先反转输入,然后反转输出。您可以使用
reversed
来执行此操作,方法是:

输出是一个反向迭代器对象,具有更大的灵活性,但您可以轻松地将其转换为列表

>>> list(remove_earlier_duplicates([3,4,4,3,6,3]))
[4, 6, 3]
>>> list(remove_earlier_duplicates([1,2,1,2,1,2,3]))
[1, 2, 3]


顺便说一句,你的
删除
功能不起作用,因为你是,这意味着某些项目会被跳过。

经过一番研究后,我找到了这种方法@wjandrea为我提供了fromkeys方法的想法,并帮了我很多忙

def retain_order(arr): 
    return list(dict.fromkeys(arr[::-1]))[::-1]

使用列表(集合(a))。这应该是可行的,但不可行,但输出将按升序排列。@Abhay不,这不是OP想要的。转换为
set
会破坏订单。另外,请不要回答评论中的问题。@Abhay这会按顺序给出输出。感谢您的尝试:)从
删除重复项([3,4,4,3,6,3])中获取
[4,6,3]
不会保留列表中作为参数传递的值的顺序。很好,简单得多!不过,欢迎!顺便说一句,我拒绝了您的编辑,因为输出故意是一个反向迭代器对象,以获得更大的灵活性,如我所说。例如,您可以在字节对象上使用它,并在退出时将其转换回字节对象,而无需中间列表:
bytes(删除之前的重复项(b'344363'))
->
b'463'
好的,酷!我建议进行编辑,因为问题需要以列表形式输出。不过这也一样好!
def retain_order(arr): 
    return list(dict.fromkeys(arr[::-1]))[::-1]