【问题标题】:Remove duplicates from a list [duplicate]从列表中删除重复项 [重复]
【发布时间】:2014-09-30 06:23:28
【问题描述】:

我编写了以下代码来从列表中删除重复项:

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.

是什么导致了这个错误?如何正确解决这个问题?

【问题讨论】:

  • 注意,当从listy中移除一个item时,len(listy)会改变;通常我们反向循环:从 len(listy) - 1 到 0
  • 你关心元素的顺序吗?如果没有,您可以从原始列表中创建一个set,然后从中创建一个列表。

标签: python


【解决方案1】:

要删除重复项,如果排序不重要,您可以使用set 函数。但如果你的目的是学习 python,那么了解你的代码有什么问题就很重要。

这很不合 Python:for i in range(len(listy)):

改用for item in 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

【讨论】:

【解决方案2】:

lista.remove 不会创建新列表,因此您不能像这样分配结果:

listy = listy.remove(a)

然后 listy 是 None 并且您尝试在 None 而不是列表上调用 pop() 时会出错。

您的代码中还有其他错误。我建议阅读这些命令的文档,以便更好地理解它们。

【讨论】:

    【解决方案3】:

    试试这个。我已经重新安排了你的功能,它会给你想要的结果

    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]
    

    【讨论】:

      【解决方案4】:

      要删除重复项,您可以使用 set 函数

      lst = [1,1,1,2,3,4]
      print list(set(lst))
      

      输出

      [1, 2, 3, 4]
      

      【讨论】:

      • 注意这里的保留顺序是“侥幸”;如果顺序很重要,这在一般情况下不起作用。
      猜你喜欢
      • 2020-04-22
      • 2021-04-02
      • 2016-01-28
      • 2016-10-19
      • 2018-12-04
      • 1970-01-01
      相关资源
      最近更新 更多