Python:如何从列表中删除所有重复的项目

时间:2011-07-20 16:03:16

标签: python list

我如何使用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,但我无法想到另一种方法。

13 个答案:

答案 0 :(得分:69)

只需填写一个新列表,如果列表中的项目尚未在新列表中输入,则只需转到原始列表中的下一个项目。

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

我认为这是正确的语法,但我的python有点不稳定,我希望你至少得到这个想法。

答案 1 :(得分:68)

使用set()

woduplicates = set(lseparatedOrblist)

返回没有重复项的集合。如果您出于某种原因需要回复列表:

woduplicates = list(set(lseperatedOrblist))

但是,这将比原始列表具有不同的订单

答案 2 :(得分:28)

你可以这样做:

x = list(set(x))

示例:如果您执行类似的操作:

x = [1,2,3,4,5,6,7,8,9,10,2,1,6,31,20]
x = list(set(x))
x

您将看到以下结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 31]

你应该想到的只有一件事:结果列表不会作为原始列表排序(在此过程中会丢失订单)。

答案 3 :(得分:18)

这应该更快并且将保留原始顺序:

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

如果您不关心订单,您可以:

new_list = list(set(my_list))

答案 4 :(得分:7)

不,这只是一个错字,最后的“列表”必须大写。你可以将循环嵌套在同一个变量上(尽管很少有理由)。

但是,代码还存在其他问题。对于初学者,您正在遍历列表,因此ij将是项而不是索引。此外,你不能在迭代时改变一个集合(好吧,你可以“运行”,但疯狂就是这样 - 例如,你可以跳过项目)。然后是复杂性问题,你的代码是O(n ^ 2)。将列表转换为set并返回list(简单,但将其余列表项随机播放)或执行以下操作:

seen = set()
new_x = []
for x in xs:
    if x in seen:
        continue
    seen.add(x)
    new_xs.append(x)

两种解决方案都要求物品可以清洗。如果那是不可能的,你可能不得不坚持你目前的方法没有提到的问题。

答案 5 :(得分:6)

这应该适合你:

new_list = list(set(old_list))

set会自动删除重复项。 list会将其重新列入清单。

答案 6 :(得分:4)

这是因为你实际上错过了大写字母。

故意缩进:

for i in lseparatedOrbList:   # capital 'L'
for j in lseparatedOrblist:   # lowercase 'l'

虽然更有效的方法是将内容插入set

如果维护列表顺序很重要(即必须“稳定”),check out the answers on this question

答案 7 :(得分:4)

最简单的方法是使用 set() 功能:

new_list = list(set(your_list))

答案 8 :(得分:3)

表示不可用的列表。它更快,因为它没有迭代已检查的条目。

def purge_dublicates(X):
    unique_X = []
    for i, row in enumerate(X):
        if row not in X[i + 1:]:
            unique_X.append(row)
    return unique_X

答案 9 :(得分:2)

维持秩序的现代方式是:

>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(lseparatedOrbList))
正如Raymond Hettinger(python core dev)in this answer所讨论的那样。在python 3.5及更高版本中,这也是最快的方法 - 有关详细信息,请参阅链接的答案。但是密钥必须是可清洗的(我认为列表就是这种情况)

答案 10 :(得分:2)

使用set

return list(set(result))

使用dict

return dict.fromkeys(result).keys()

答案 11 :(得分:-2)

有一种更快的方法可以解决这个问题:

list = [1, 1.0, 1.41, 1.73, 2, 2, 2.0, 2.24, 3, 3, 4, 4, 4, 5, 6, 6, 8, 8, 9, 10]
list2=[]

for value in list:
    try:
        list2.index(value)
    except:
        list2.append(value)
list.clear()
for value in list2:
    list.append(value)
list2.clear()
print(list)
print(list2)

答案 12 :(得分:-2)

通过这种方式,可以删除列表中多次出现的特定项目:尝试删除全部5

list1=[1,2,3,4,5,6,5,3,5,7,11,5,9,8,121,98,67,34,5,21]
print list1
n=input("item to be deleted : " )
for i in list1:
    if n in list1:
        list1.remove(n)
print list1