从列表中删除重复项
我写了以下代码来从一个列表中去除重复项:
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.
这个错误是怎么回事?怎么才能修复它,让代码正确运行呢?
4 个回答
0
lista.remove并不会创建一个新列表,所以你不能像这样给结果赋值:
listy = listy.remove(a)
这样一来,listy就变成了None(空值),你在尝试对None调用pop()时就会出错,因为None不是一个列表。
另外,你的代码里还有其他错误。我建议你去看看这些命令的文档,这样可以更好地理解它们。
0
要去除重复的内容,你可以使用集合(set)这个功能。
lst = [1,1,1,2,3,4]
print list(set(lst))
输出结果
[1, 2, 3, 4]
0
试试这个。我稍微调整了一下你的函数,它会给你想要的结果。
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]
2
如果你想去掉重复的东西,可以用 set
这个函数,前提是你不在乎顺序。不过,如果你是想学 Python,那就得知道你代码里的问题。
这样写很不符合 Python 的风格:for i in range(len(listy)):
应该改成:for item in listy:
用 a = listy.pop(i)
这样写会出问题,因为在循环中你在删除列表里的元素。循环开始时在的元素,等到 pop()
执行时可能就不在了。
而且 remove
函数并不会返回一个列表!所以这样写是错的: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