如何从列表中删除所有重复项

79 投票
11 回答
244607 浏览
提问于 2025-04-16 21:56

我想用Python来检查一个列表,并删除所有重复的项。我不想指定哪个是重复的项——我希望代码自己找出有没有重复的,并把它们删掉,只保留每个项的一个实例。如果列表中有多个重复的项,这段代码也要能处理。

举个例子,我下面的代码中,列表 lseparatedOrbList 有12个项目——其中一个重复了六次,另一个重复了五次,还有一个只出现了一次。我希望把这个列表改成只有三个项目——每个项目各保留一个,并且保持它们之前出现的顺序。我试过这样做:

for i in lseparatedOrbList:
   for j in lseparatedOrblist:
        if lseparatedOrbList[i] == lseparatedOrbList[j]:
            lseparatedOrbList.remove(lseparatedOrbList[j])

但是我遇到了这个错误:

Traceback (most recent call last):
  File "qchemOutputSearch.py", line 123, in <module>
    for j in lseparatedOrblist:
NameError: name 'lseparatedOrblist' is not defined

我猜是因为我在遍历 lseparatedOrbList 的时候又在循环它,但我想不出其他的办法来解决这个问题。

11 个回答

42

这样做会更快,而且能保持原来的顺序:

seen = {}
new_list = [seen.setdefault(x, x) for x in my_list if x not in seen]

如果你不在乎顺序的话,你可以直接这样做:

new_list = list(set(my_list))
142

使用 set()

woduplicates = set(lseparatedOrblist)

这个方法会返回一个没有重复元素的集合。如果你出于某种原因需要把它变回列表:

woduplicates = list(set(lseperatedOrblist))

不过,这样得到的列表会和你原来的列表有不同的顺序

103

只需要创建一个新的列表来填充。如果你要放入的新列表中还没有这个项目,就把它放进去;如果已经有了,就直接跳过,继续看原列表中的下一个项目。

for i in mylist:
  if i not in newlist:
    newlist.append(i)

撰写回答