我正在尝试一个简单的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)。我在这里错过了什么?
答案 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
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
答案可能是首选,但为了简洁明了......