简单的python嵌套循环 - 索引超出范围

时间:2012-08-30 09:08:01

标签: python list for-loop set

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

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

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

4 个答案:

答案 0 :(得分:5)

不要del nums[x],因为这样可以缩短nums,从而获得例外。

您可以通过set_nums = set(nums)

简单地从列表中创建一个集合

答案 1 :(得分:3)

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

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

unique_set = set(nums)

并再次将其转换为列表:

unique_list = list(set(nums))

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您提供的示例可以简单地用一行代码替换:

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, [])