Python 从列表中删除重复项
我编写了以下代码以从列表中删除重复项:Python 从列表中删除重复项,python,Python,我编写了以下代码以从列表中删除重复项: def remove_duplicates(listy): new_listy = [] for i in range(len(listy)): a = listy.pop(i) while a in listy: listy = listy.remove(a) else: new_listy.append(a) return new_listy 运行代码时
def remove_duplicates(listy):
new_listy = []
for i in range(len(listy)):
a = listy.pop(i)
while a in listy:
listy = listy.remove(a)
else: new_listy.append(a)
return new_listy
运行代码时出现以下错误:
Traceback (most recent call last):
File "<pyshell#93>", line 1, in <module>
remove_duplicates([1,1,2,2])
File "C:\Python27\MIT_4.py", line 4, in remove_duplicates
a = listy.pop(i)
AttributeError: 'NoneType' object has no attribute 'pop.
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
删除重复项([1,1,2,2])
文件“C:\Python27\MIT_4.py”,第4行,删除重复项
a=利斯蒂·波普(i)
AttributeError:“非类型”对象没有属性“pop”。
是什么导致了这个错误?如何正确解决此问题?要删除重复项,可以使用set函数
lst = [1,1,1,2,3,4]
print list(set(lst))
输出
[1, 2, 3, 4]
试试这个。我重新安排了你的函数,它会给你想要的结果
list1 = [1,1,2,2,3]
def remove_duplicates(listy):
new_listy = []
for i in listy:
if i not in new_listy:
new_listy.append(i)
return new_listy
print remove_duplicates(list1)
Output: [1,2,3]
lista.remove不会创建新的列表,因此不能按如下方式分配结果:
listy = listy.remove(a)
然后listy是None,您在尝试调用None而不是list上的pop()时会出错
代码中还有其他错误。我建议您阅读这些命令的文档,以便更好地理解它们。要删除重复的命令,如果顺序不重要,您可以使用
set
功能。但是,如果您的目的是学习python,那么了解代码的错误是很重要的
这是非常不和谐的:对于范围内的i(len(listy)):
改为对列表中的项目使用:
使用a=listy.pop(i)
这种方式会导致问题,因为循环中的列表元素正在被删除。当执行pop()
时,循环开始时存在的元素将不再可用
删除函数不返回列表!所以这是错误的:listy=listy.remove(a)
没有必要从listy中删除,因为您正在创建一个新列表。如果希望更新listy,请将函数的返回值指定给listy
删除重复项并返回保留原始顺序的新列表的一种方法:
def remove_duplicates(listy):
new_listy = []
for item in listy:
if item not in new_listy:
new_listy.append(item)
return new_listy
请注意,当从listy中删除某个项目时,len(listy)会发生更改;通常我们以相反的方式循环:从len(listy)-1到0您关心元素的顺序吗?如果没有,您可以从原始列表中创建一个
集合
,然后从中创建一个列表;如果顺序很重要,在一般情况下,这将不起作用。我在这里找到了一个: