Search code examples
pythonpython-2.7arraylistnested-listspython-itertools

Remove consecutive duplicates from a 2D list , python?


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]

Solution

  • 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]