我如何使用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,但我无法想到另一种方法。
答案 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)
不,这只是一个错字,最后的“列表”必须大写。你可以将循环嵌套在同一个变量上(尽管很少有理由)。
但是,代码还存在其他问题。对于初学者,您正在遍历列表,因此i
和j
将是项而不是索引。此外,你不能在迭代时改变一个集合(好吧,你可以“运行”,但疯狂就是这样 - 例如,你可以跳过项目)。然后是复杂性问题,你的代码是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