【问题标题】:Python list loopsPython 列表循环
【发布时间】:2020-06-25 07:42:30
【问题描述】:

在这段代码中,我试图删除列表中的每个重复元素,只是让所有元素唯一且不重复,所以当我运行这段代码时会出现错误:

myList = [1, 2, 4, 4, 1, 4, 2, 6, 2, 9]
repeat = 0
for i in range(len(myList)-1):
    for j in range(len(myList)-1):
        if myList[i]== myList[j]:
            repeat+=1
            if repeat>1:
                del myList[j]
            
print("The list with unique elements only:")
print(myList)

出现的错误是:

    Traceback (most recent call last):
  File "main.py", line 8, in <module>
    if myList[i]== myList[j]:
IndexError: list index out of range

为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 说,列表中有 3 个元素。你找到一个重复并删除 1。但循环是从 0 到 2 的迭代。所以当说i 变成 2 时,myList[i] 不存在,这就是你得到错误的原因
  • 这能回答问题吗,stackoverflow.com/questions/7961363/…
  • @kuro 这是一个有用的注释,这是我的错误,非常感谢。
  • @Sushanth 很好,但除了列表和 for 循环之外,我不必使用任何内置函数,例如 Set of List。
  • 这能回答你的问题吗? Removing duplicates in lists

标签: python python-3.x list for-loop


【解决方案1】:

在循环数组的同时修改数组是一个非常糟糕的主意,因为您无法控制事情的处理方式。

我可以为您的问题提出这两种解决方案吗? 第一个是使用set。

myList = [1, 2, 4, 4, 1, 4, 2, 6, 2, 9]

myList = list(set(myList))

print("The list with unique elements only:")
print(myList)

另一个解决方案是使用另一个数组

myList = [1, 2, 4, 4, 1, 4, 2, 6, 2, 9]

uniques = []
for number in myList:
    if number not in uniques:
        uniques.append(number)

print("The list with unique elements only:")
print(uniques)

【讨论】:

  • 这是一个很好的解决方案,谢谢,但是对于第一个我不能使用任何内置函数,如 list 和 set 所以我使用了第二个解决方案,这是正确的。
【解决方案2】:

您可以将列表转换为集合,它会自动删除所有重复的元素

a = [1, 2, 4, 4, 1, 4, 2, 6, 2, 9]

unique_list = list(set(a))

print(a)

注意:我们再次将集合转换为列表

【讨论】:

    【解决方案3】:

    这里发生的事情是您正在删除列表中的一些元素,使其更短。

    由于您的 for 循环正在为原始列表的长度运行,您最终将尝试访问不再存在的索引。这将导致您获得“列表索引超出范围”

    要亲自查看,您可以添加打印语句,如下所示:

    myList = [1, 2, 4, 4, 1, 4, 2, 6, 2, 9]
    repeat = 0
    for i in range(len(myList)-1):
        for j in range(len(myList)-1):
            print(i,j,len(myList))
            if myList[i]== myList[j]:
                repeat+=1
                if repeat>1:
                    del myList[j]
    

    【讨论】:

      【解决方案4】:

      设置数据类型在 Python 中用于去除重复性。每当需要仅查看其中唯一值的任何迭代器时,都可以将其转换为一个集合,这将删除所有重复值。例如:

      lis=[2,2,3,4]
      l=set(lis)
      print(l)
      

      输出:

      {2, 3, 4}
      

      可以转换回列表:

      lis=[2,2,3,4]
      l=set(lis)
      print(l)
      l=list(l)
      print(l)
      

      输出:

      {2, 3, 4}
      [2, 3, 4]
      

      同样:

      myList = [1, 2, 4, 4, 1, 4, 2, 6, 2, 9]
      s=set(myList)
      l=list(s)
      print(l)
      

      输出:

      [1, 2, 4, 6, 9]
      

      Frozen sets 也可用于此目的。虽然;冻结集合的元素在创建后保持不变,即它们不能被修改,不像集合的元素是可变的(可以修改)。
      希望这对您有所帮助!

      【讨论】:

        猜你喜欢
        • 2016-02-25
        • 2016-08-02
        • 2021-11-13
        • 2015-05-07
        • 2021-02-24
        • 2018-10-26
        • 2020-05-29
        • 2019-04-29
        相关资源
        最近更新 更多