从列表中删除重复项

0 投票
4 回答
1808 浏览
提问于 2025-04-18 16:20

我写了以下代码来从一个列表中去除重复项:

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

撰写回答