How can i remove consecutive duplicates from a 2d list according to a particular element ( in this case the 2nd element) .
i tried few combinations with itertools but had no luck .
Can anyone suggest me how to solve this ?
INPUT
192.168.1.232 >>>>> 173.194.36.64 , 14 , 15 , 16
192.168.1.232 >>>>> 173.194.36.64 , 14 , 15 , 17
192.168.1.232 >>>>> 173.194.36.119 , 23 , 30 , 31
192.168.1.232 >>>>> 173.194.36.98 , 24 , 40 , 41
192.168.1.232 >>>>> 173.194.36.98 , 24 , 40 , 62
192.168.1.232 >>>>> 173.194.36.74 , 25 , 42 , 43
192.168.1.232 >>>>> 173.194.36.74 , 25 , 42 , 65
192.168.1.232 >>>>> 173.194.36.74 , 26 , 44 , 45
192.168.1.232 >>>>> 173.194.36.74 , 26 , 44 , 66
192.168.1.232 >>>>> 173.194.36.78 , 27 , 46 , 47
OUTPUT
192.168.1.232 >>>>> 173.194.36.64 , 14 , 15 , 16
192.168.1.232 >>>>> 173.194.36.119 , 23 , 30 , 31
192.168.1.232 >>>>> 173.194.36.98 , 24 , 40 , 41
192.168.1.232 >>>>> 173.194.36.74 , 25 , 42 , 43
192.168.1.232 >>>>> 173.194.36.78 , 27 , 46 , 47
This the expected output.
UPDATE
The above given is a nicely printed form of the list.
the actual list looks like this .
>>> for x in connection_frame:
print x
['192.168.1.232', '173.194.36.64', 14, 15, 16]
['192.168.1.232', '173.194.36.64', 14, 15, 17]
['192.168.1.232', '173.194.36.119', 23, 30, 31]
['192.168.1.232', '173.194.36.98', 24, 40, 41]
['192.168.1.232', '173.194.36.98', 24, 40, 62]
['192.168.1.232', '173.194.36.74', 25, 42, 43]
['192.168.1.232', '173.194.36.74', 25, 42, 65]
['192.168.1.232', '173.194.36.74', 26, 44, 45]
['192.168.1.232', '173.194.36.74', 26, 44, 66]
['192.168.1.232', '173.194.36.78', 27, 46, 47]
['192.168.1.232', '173.194.36.78', 27, 46, 67]
['192.168.1.232', '173.194.36.78', 28, 48, 49]
['192.168.1.232', '173.194.36.78', 28, 48, 68]
['192.168.1.232', '173.194.36.79', 29, 50, 51]
['192.168.1.232', '173.194.36.79', 29, 50, 69]
['192.168.1.232', '173.194.36.119', 32, 52, 53]
['192.168.1.232', '173.194.36.119', 32, 52, 74]
So because you want to preserve order and only pop connsecutive entries, I don't know of any fancy built-in you can use. So here's the "brute-force" method:
>>> remList = []
>>> for i in range(len(connection_frame)):
... if (i != len(connection_frame)-)1 and (connection_frame[i][1] == connection_frame[i+1][1]):
... remList.append(i)
...
for i in remList:
connection_frame.pop(i)
['192.168.1.232', '173.194.36.119', 32, 52, 53]
['192.168.1.232', '173.194.36.79', 29, 50, 51]
['192.168.1.232', '173.194.36.78', 28, 48, 49]
['192.168.1.232', '173.194.36.78', 27, 46, 67]
['192.168.1.232', '173.194.36.78', 27, 46, 47]
['192.168.1.232', '173.194.36.74', 26, 44, 45]
['192.168.1.232', '173.194.36.74', 25, 42, 65]
['192.168.1.232', '173.194.36.74', 25, 42, 43]
['192.168.1.232', '173.194.36.98', 24, 40, 41]
['192.168.1.232', '173.194.36.64', 14, 15, 16]
>>>
>>> for conn in connection_frame:
... print conn
...
['192.168.1.232', '173.194.36.64', 14, 15, 17]
['192.168.1.232', '173.194.36.119', 23, 30, 31]
['192.168.1.232', '173.194.36.98', 24, 40, 62]
['192.168.1.232', '173.194.36.74', 26, 44, 66]
['192.168.1.232', '173.194.36.78', 28, 48, 68]
['192.168.1.232', '173.194.36.79', 29, 50, 69]
['192.168.1.232', '173.194.36.119', 32, 52, 74]
>>>
Or if you wanna do it all in one go with a list comprehension:
>>> new_frame = [conn for conn in connection_frame if not connection_frame.index(conn) in [i for i in range(len(connection_frame)) if (i != len(connection_frame)-1) and (connection_frame[i][1] == connection_frame[i+1][1])]]
>>>
>>> for conn in new_frame:
... print conn
...
['192.168.1.232', '173.194.36.64', 14, 15, 17]
['192.168.1.232', '173.194.36.119', 23, 30, 31]
['192.168.1.232', '173.194.36.98', 24, 40, 62]
['192.168.1.232', '173.194.36.74', 26, 44, 66]
['192.168.1.232', '173.194.36.78', 28, 48, 68]
['192.168.1.232', '173.194.36.79', 29, 50, 69]
['192.168.1.232', '173.194.36.119', 32, 52, 74]