删除python中列表中的相邻元素

时间:2014-05-05 15:06:03

标签: python-2.7

我正在尝试一个简单的python程序,它删除列表中的所有相邻元素

def main():
    a = [1, 5, 2, 3, 3, 1, 2, 3, 5, 6]
    c = len(a)

    for i in range (0, c-2):
        if a[i] == a[i+1]:
            del a[i]
            c = len(a)

    print a

if __name__ == '__main__':
    main()

,输出

[1, 5, 2, 3, 3, 2, 3, 5, 6]这一切都很好!

如果将列表更改为a = [1, 5, 2, 3, 3, 1, 2, 2, 5, 6]

然后它会出错

索引列表超出范围

**if a[i] == a[i+1]**

它不应该抱怨索引超出范围,因为我每次删除列表中的元素时都在计算len(a)。我在这里错过了什么?

2 个答案:

答案 0 :(得分:3)

for i in range (0, c-2):

这与其他一些语言中的for循环不同;它正在迭代range返回的列表(一次)。稍后更改c时,它不会影响此循环。

可以使用while代替:

c = len(a)

while i < c - 2:
    if a[i] == a[i + 1]:
        del a[i]
        c = len(a)
    else:
        i += 1

还有itertools.groupby

import itertools

def remove_consecutive(l):
    return (k for k, v in itertools.groupby(l))

答案 1 :(得分:0)

这是一种略有不同的方法:

origlist=[1, 5, 2, 3, 3, 1, 2, 3, 5, 6]
newlist=[origlist[0]]
for elem in origlist[1:]:
  if (elem != newlist[-1]):
    newlist.append(elem)

上面的itertools答案可能是首选,但为了简洁明了......