# Python | Shrink given list for repeating elements

Given a list of repetitive elements, Write a python program to shrink the repetition of the elements and convert the repetition into a tuple element of the list containing the repeated element and number of times it has repeated, Thus, converting the given list into a list of tuples.

Examples:

Input : [1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 4]
Output : [(1, 3), (2, 1), (3, 3), (4, 4)]

Input : ['alice', 'alice', 'bob']
Output : [('alice', 2), ('bob', 1)]

Approach #1 : Brute force
This is a Naive approach in order to shrink the list. It takes another list say, ‘tup_list’. Initialize index to 0 and use a loop to check how many times each unique element of the list is repeated. Once found the element and its repeat count, append it to the list in form of a tuple.

 # Python3 program to Shrink list  # for repeating elements    def shrinkList(lst):     tup_list = []     i, index = 0, 0     while(index < len(lst)):         element_count = 0         while(i < len(lst) and lst[i] == lst[index]):             element_count += 1             i += 1         tup_list.append((lst[index], element_count))         index += element_count                return tup_list    # Driver Code lst = [1, 1, 1, 2, 2, 3, 3, 4] print(shrinkList(lst))

Output:

[(1, 3), (2, 2), (3, 2), (4, 1)]

Approach #2 : Alternate Brute force
This is another brute force approach which uses for loop to traverse the list. It uses a variable ‘prev_element’ to store the previous element. First, it checks if this is the first unique element or not, if yes, It increments the counter and stores the element to prev_element. If the element is repeated, just increment the counter. If all these cases are not true then just append the prev_element and count as tuple to tup_list.

 # Python3 program to Shrink list  # for repeating elements    def shrinkList(lst):     prev_element = None     count = 0     tup_list = []        for ele in lst:         if (prev_element == ele):              count += 1                        elif (prev_element is None):             count += 1             prev_element = ele                        else:             tup_list.append((prev_element, count))             count = 1             prev_element = ele        tup_list.append((prev_element, count))     return tup_list    # Driver Code lst = [1, 1, 1, 2, 2, 3, 3, 4] print(shrinkList(lst))

Output:

[(1, 3), (2, 2), (3, 2), (4, 1)]

Approach #3 : Using Itertools.groupby()
This is a more pythonic approach to solve the given problem. The itertools.groupby() make an iterator that returns consecutive keys and groups from the iterable. It groups similar elements and returns the elements and their count as list of tuples.

 # Python3 program to Shrink list  # for repeating elements from itertools import groupby    def shrinkList(lst):     return ([(element, len(list(i)))     for element, i in groupby(lst)])    # Driver Code lst = [1, 1, 1, 2, 2, 3, 3, 4] print(shrinkList(lst))

Output:

[(1, 3), (2, 2), (3, 2), (4, 1)]

My Personal Notes arrow_drop_up

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.