【问题标题】:Simple python nested loops - index out of range简单的python嵌套循环-索引超出范围
【发布时间】:2012-08-30 09:08:01
【问题描述】:

当我运行以下代码时,出现错误:

def genSet(nums):
    for i in range(0, len(nums)-1):
        for x in range(0, len(nums)-1):
            if nums[x] == nums[i]:
                del nums[x] 
    return nums

a = [5, 4, 3, 5, 6, 7, 8, 5, 4, 3]  
print genSet(a)

输出:

Traceback (most recent call last):
  File "49.py", line 9, in <module>
    print genSet(a)
  File "49.py", line 4, in genSet
    if nums[x] == nums[i]:
IndexError: list index out of range

据我所知(我将 if 语句替换为“print x, i”)两个 for 循环都很好,那么为什么索引超出范围?

【问题讨论】:

  • 您不能在循环遍历列表时从列表中del
  • @thg435:嗯,你可以,但如果你这样做,可能会发生意想不到的事情。
  • @Tim:“好吧,儿子,你可以玩火柴,但可能会发生意想不到的事情”))

标签: python list for-loop set


【解决方案1】:

不要使用del nums[x],因为这样会使nums 更短,从而导致异常。

您可以简单地通过set_nums = set(nums)从列表中创建一个集合

【讨论】:

    【解决方案2】:

    您正在从 nums 中删除元素,因此它会变短并发生 IndexError。

    无论如何,您的代码会删除所有内容,因为每个元素在列表中至少有一个相同的元素(本身!)。如果你想创建一个“唯一”的元素列表,创建一个集合:

    unique_set = set(nums)
    

    并再次将其转换为列表:

    unique_list = list(set(nums))
    

    【讨论】:

      【解决方案3】:

      您可以找到数字相同的索引,将您的列表添加到一个 numpy 数组 nums = np.array(nums) 并使用 np.delete 命令。

      【讨论】:

        【解决方案4】:

        你给出的例子可以简单的换成一行代码:

        print set([5, 4, 3, 5, 6, 7, 8, 5, 4, 3])
        

        如果我真的想自己过滤掉列表中的重复项,我会:

        nums = sorted([5, 4, 3, 5, 6, 7, 8, 5, 4, 3])
        print reduce(lambda x,y:(y not in x and x+[y]) or x, nums, [])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-25
          • 1970-01-01
          • 2018-05-19
          • 2016-10-03
          • 1970-01-01
          • 2022-11-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多