删除list里的重复元素

##方法一:先排序后比较大小

if List:
    List.sort()
last = List[-1]
for i in range(len(List)-2, -1, -1):
    if last==List[i]: 
        del List[i]
    else: 
        last=List[i]

问题:为什么要从后往前迭代呢?我们可以从list[0]开始啊,代码如下:

if List:
    List.sort()
begin = List[0]
for i in range(1, len(list)):
    if begin==List[i]: 
        del List[i]
    else: 
        begin=List[i]

运行一下,报错如下:

IndexError: list index out of range

数组访问越界了!why?

我们调用del删除list里的元素,相应的list的长度也会自动减小,但我们迭代的范围range(1, len(list))是一开始就计算好的,所以必然会越界。比如说:

li = [1,1,2,2,3,3,3,4,5,6]

调用len计算得到li的长度为10,range(1,10)得到我们迭代的序列是1-9,但是当我们删除了li中的重复元素1,2,3之后,li的长度只剩下了6,可是我们依然会访问li[7],因为访问序列一开始就计算好了,所以必然造成了越界。

那从后向前是如何避免越界的呢?从后向前遍历,删除元素后,只是把这个元素之后的已经没有重复元素的序列向前移动一位,数组依然在变短,但这个时候是不会影响到我们向前遍历的。

##方法二:使用set

>>> li = [1,2,4,5,7,8,2,3,4,56,7]
>>> list(set(li))
>>> [1, 2, 3, 4, 5, 7, 8, 56]

##方法三:使用列表综合

l1 = ['b','c','d','b','c','a','a']  
l2 = []  
[l2.append(i) for i in l1 if not i in l2]  
print l2