1

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

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

4 回答 4

5

不要这样做del nums[x],因为这样你会nums缩短并因此得到一个例外。

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

于 2012-08-30T09:10:52.310 回答
3

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

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

unique_set = set(nums)

并再次将其转换为列表:

unique_list = list(set(nums))
于 2012-08-30T09:10:20.337 回答
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, [])
于 2012-08-30T10:09:58.560 回答
0

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

于 2012-08-30T09:16:27.377 回答