Sometimes, while working with records, we can have a problem in which we need to collect and maintain the counter value inside records. This kind of application is important in the web development domain. Let’s discuss certain ways in which this task can be performed.
Method #1 : Using loop + Counter() + set()
The combination of the above functionalities can be employed to achieve this task. In this, we run a loop to capture each tuple and add to set and check if it’s already existing, then increase and add a counter value to it. The cumulative count is achieved by using Counter().
Python3
from collections import Counter
test_list = [( 'gfg' , ), ( 'is' , ), ( 'best' , ), ( 'gfg' , ),
( 'is' , ), ( 'for' , ), ( 'geeks' , )]
print ( "The original list : " + str (test_list))
res = []
temp = set ()
counter = Counter(test_list)
for sub in test_list:
if sub not in temp:
res.append((counter[sub], ) + sub)
temp.add(sub)
print ( "Grouped and counted list is : " + str (res))
|
Output
The original list : [('gfg',), ('is',), ('best',), ('gfg',), ('is',), ('for',), ('geeks',)]
Grouped and counted list is : [(2, 'gfg'), (2, 'is'), (1, 'best'), (1, 'for'), (1, 'geeks')]
Time complexity: O(n)
Auxiliary space: O(n)
Method #2: Using Counter() + list comprehension + items()
This is a one-liner approach and is recommended to use in programming. The task of loops is handled by list comprehension and items() are used to access all the elements of the Counter converted dictionary to allow computations.
Python3
from collections import Counter
test_list = [( 'gfg' , ), ( 'is' , ), ( 'best' , ), ( 'gfg' , ),
( 'is' , ), ( 'for' , ), ( 'geeks' , )]
print ( "The original list : " + str (test_list))
res = [(counter, ) + ele for ele, counter in Counter(test_list).items()]
print ( "Grouped and counted list is : " + str (res))
|
Output
The original list : [('gfg',), ('is',), ('best',), ('gfg',), ('is',), ('for',), ('geeks',)]
Grouped and counted list is : [(2, 'gfg'), (2, 'is'), (1, 'best'), (1, 'for'), (1, 'geeks')]
Time complexity: O(n), where n is the number of elements in the list “test_list”.
Auxiliary space: O(n), as it stores the result in a new list “res”.
Method #3 : Using count(),join(),list() and set() methods
Python3
test_list = [( 'gfg' , ), ( 'is' , ), ( 'best' , ), ( 'gfg' , ),
( 'is' , ), ( 'for' , ), ( 'geeks' , )]
print ( "The original list : " + str (test_list))
res = []
x = list ( set (test_list))
for i in x:
a = test_list.count(i)
b = "".join(i)
res.append((a, b))
print ( "Grouped and counted list is : " + str (res))
|
Output
The original list : [('gfg',), ('is',), ('best',), ('gfg',), ('is',), ('for',), ('geeks',)]
Grouped and counted list is : [(2, 'gfg'), (1, 'best'), (1, 'geeks'), (1, 'for'), (2, 'is')]
Time complexity: O(n^2) – due to the use of count() method within the for loop.
Auxiliary space: O(n) – used to store the result list.
Method 4: using operator.countOf() method
Python3
import operator as op
test_list = [( 'gfg' , ), ( 'is' , ), ( 'best' , ), ( 'gfg' , ),
( 'is' , ), ( 'for' , ), ( 'geeks' , )]
print ( "The original list : " + str (test_list))
res = []
x = list ( set (test_list))
for i in x:
a = op.countOf(test_list, i)
b = "".join(i)
res.append((a, b))
print ( "Grouped and counted list is : " + str (res))
|
Output
The original list : [('gfg',), ('is',), ('best',), ('gfg',), ('is',), ('for',), ('geeks',)]
Grouped and counted list is : [(2, 'gfg'), (1, 'best'), (1, 'for'), (1, 'geeks'), (2, 'is')]
Time Complexity: O(N)
Auxiliary Space : O(N)
Method #5: Using defaultdict() and list comprehension
This method uses a defaultdict to count the occurrences of each sub-list in the given list. Then, it creates a new list using a list comprehension by unpacking each sub-list and adding the count value as the first element of the tuple.
Python3
from collections import defaultdict
test_list = [( 'gfg' , ), ( 'is' , ), ( 'best' , ), ( 'gfg' , ),
( 'is' , ), ( 'for' , ), ( 'geeks' , )]
print ( "The original list : " + str (test_list))
counter = defaultdict( int )
for sub in test_list:
counter[sub] + = 1
res = [(count,) + sub for sub, count in counter.items()]
print ( "Grouped and counted list is : " + str (res))
|
Output
The original list : [('gfg',), ('is',), ('best',), ('gfg',), ('is',), ('for',), ('geeks',)]
Grouped and counted list is : [(2, 'gfg'), (2, 'is'), (1, 'best'), (1, 'for'), (1, 'geeks')]
Time complexity: O(n), where n is the length of the input list test_list.
Auxiliary space: O(k), where k is the number of distinct elements in the input list.
Method #7: Using itertools.groupby() and len()
This approach uses itertools.groupby() to group the elements of the test_list by their value, and then applies len() to each group to get the count of similar records. It then creates a new list with the count and the element value.
Approach:
- Import itertools.
- Sort the test_list to ensure that similar records are grouped together.
- Use itertools.groupby() to group the elements of the test_list by their value.
- Use a list comprehension to create a list with the count and the element value for each group.
- Print the original list and the new list.
Python3
import itertools
test_list = [( 'gfg' , ), ( 'is' , ), ( 'best' , ), ( 'gfg' , ),
( 'is' , ), ( 'for' , ), ( 'geeks' , )]
test_list.sort()
res = [( len ( list (group)), key) for key, group in itertools.groupby(test_list)]
print ( "The original list : " + str (test_list))
print ( "Grouped and counted list is : " + str (res))
|
Output
The original list : [('best',), ('for',), ('geeks',), ('gfg',), ('gfg',), ('is',), ('is',)]
Grouped and counted list is : [(1, ('best',)), (1, ('for',)), (1, ('geeks',)), (2, ('gfg',)), (2, ('is',))]
Time complexity: O(NlogN) due to sorting the list.
Auxiliary space: O(N) to store the new list.
Whether you're preparing for your first job interview or aiming to upskill in this ever-evolving tech landscape,
GeeksforGeeks Courses are your key to success. We provide top-quality content at affordable prices, all geared towards accelerating your growth in a time-bound manner. Join the millions we've already empowered, and we're here to do the same for you. Don't miss out -
check it out now!