anishjp
anishjp

Reputation: 115

Remove adjacent element in a list in python

I am trying to do a simple python program that removes all the adjacent elements in a list

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()

and the output is

[1, 5, 2, 3, 3, 2, 3, 5, 6] which is all fine!

If change the a list to a = [1, 5, 2, 3, 3, 1, 2, 2, 5, 6]

then it gives an error

index list out of range

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

It shouldn't be complaining about the index out of range as I am calculating the len(a) every time it deletes an element in the list. What am I missing here?

Upvotes: 3

Views: 1353

Answers (2)

twalberg
twalberg

Reputation: 62379

Here's a slightly different approach:

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)

The itertools answer above may be preferred, though, for brevity and clarity...

Upvotes: 0

Ry-
Ry-

Reputation: 224904

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

This is not like a for loop in some other languages; it’s iterating over a list returned (once) by range. When you change c later, it does not affect this loop.

You can use while instead:

c = len(a)

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

There’s also itertools.groupby:

import itertools

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

Upvotes: 4

Related Questions