Python | Group tuple into list based on value
Last Updated :
13 Apr, 2023
Sometimes, while working with Python tuples, we can have a problem in which we need to group tuple elements to nested list on basis of values allotted to it. This can be useful in many grouping applications. Let’s discuss certain ways in which this task can be performed.
Method #1 : Using itemgetter() + list comprehension + groupby()
The combination of above functions can be used to perform this task. In this, we access the value using itemgetter() and logic for grouping is performed using groupby() and list comprehension.
Python3
from operator import itemgetter
from itertools import groupby
test_list = [( 1 , 4 ), ( 2 , 4 ), ( 6 , 7 ), ( 5 , 1 ), ( 6 , 1 ), ( 8 , 1 )]
print ( "The original list : " + str (test_list))
res = [[i for i, j in temp]\
for key, temp in groupby(test_list, key = itemgetter( 1 ))]
print ( "The list after grouping by value : " + str (res))
|
Output
The original list : [(1, 4), (2, 4), (6, 7), (5, 1), (6, 1), (8, 1)]
The list after grouping by value : [[1, 2], [6], [5, 6, 8]]
Time Complexity: O(n*n), where n is the length of the list test_list
Auxiliary Space: O(n) additional space of size n is created where n is the number of elements in the res list
Method #2: Using map() + itemgetter() + groupby() + list comprehension
This method is similar to the above method, the only difference is that we chose a map for the formation of keys as nested list for formation of new resultant lists.
Python3
from operator import itemgetter
from itertools import groupby
test_list = [( 1 , 4 ), ( 2 , 4 ), ( 6 , 7 ), ( 5 , 1 ), ( 6 , 1 ), ( 8 , 1 )]
print ( "The original list : " + str (test_list))
res = [ list ( map (itemgetter( 0 ), temp))
for (key, temp) in groupby(test_list, itemgetter( 1 ))]
print ( "The list after grouping by value : " + str (res))
|
Output
The original list : [(1, 4), (2, 4), (6, 7), (5, 1), (6, 1), (8, 1)]
The list after grouping by value : [[1, 2], [6], [5, 6, 8]]
The time complexity of this approach is O(n log n) due to sorting by the itemgetter() function. The groupby() function and the list comprehension run in linear time.
The auxiliary space complexity is O(n) for the list used to store the grouped tuples, where n is the length of the input list.
Method #3 : Using defaultdict()
This method uses the defaultdict() from the collections module to group the tuples based on the second element of the tuple as the key and the first element as the value. The result is then transformed into a list of lists using list comprehension.
Python3
from collections import defaultdict
test_list = [( 1 , 4 ), ( 2 , 4 ), ( 6 , 7 ), ( 5 , 1 ), ( 6 , 1 ), ( 8 , 1 )]
print ( "The original list : " + str (test_list))
temp = defaultdict( list )
for i, j in test_list:
temp[j].append(i)
res = [temp[i] for i in temp]
print ( "The list after grouping by value : " + str (res))
|
Output
The original list : [(1, 4), (2, 4), (6, 7), (5, 1), (6, 1), (8, 1)]
The list after grouping by value : [[1, 2], [6], [5, 6, 8]]
Time complexity: O(n)
Auxiliary Space : O(n)
Method 4: using the itertools module’s groupby() function:
Approach:
- Import the itertools module.
- Initialize the list with tuples.
- Sort the list based on the second element of each tuple using the sorted() function with a lambda function as the key.
- Use the groupby() function from the itertools module to group the sorted list based on the second element of each tuple. We also use a lambda function to get the second element as the key.
- Iterate through each group and append the first element of each tuple to a list.
- Print the result.
Python3
import itertools
test_list = [( 1 , 4 ), ( 2 , 4 ), ( 6 , 7 ), ( 5 , 1 ), ( 6 , 1 ), ( 8 , 1 )]
print ( "The original list : " + str (test_list))
temp = itertools.groupby(
sorted (test_list, key = lambda x: x[ 1 ]), key = lambda x: x[ 1 ])
res = [[i[ 0 ] for i in g] for k, g in temp]
print ( "The list after grouping by value : " + str (res))
|
Output
The original list : [(1, 4), (2, 4), (6, 7), (5, 1), (6, 1), (8, 1)]
The list after grouping by value : [[5, 6, 8], [1, 2], [6]]
Time complexity: O(nlogn), where n is the number of tuples in the list. We need to sort the list before using the groupby() function.
Auxiliary space: O(n), where n is the number of tuples in the list. We need to store the values in a list.
Method #5: Using dictionary and for loop
Step-by-step approach:
- Create an empty dictionary to store the grouped tuples
- Loop through the tuples in the list
- Get the second element of the tuple
- If the key is not already in the dictionary, add it to an empty list as value
- Append the current tuple to the list corresponding to the key in the dictionary
- Convert the dictionary values to lists and store in res
- Printing result
Below is the implementation of the above approach:
Python3
test_list = [( 1 , 4 ), ( 2 , 4 ), ( 6 , 7 ), ( 5 , 1 ), ( 6 , 1 ), ( 8 , 1 )]
print ( "The original list : " + str (test_list))
grouped_dict = {}
for tup in test_list:
key = tup[ 1 ]
if key not in grouped_dict:
grouped_dict[key] = []
grouped_dict[key].append(tup[ 0 ])
res = [v for k, v in grouped_dict.items()]
print ( "The list after grouping by value : " + str (res))
|
Output
The original list : [(1, 4), (2, 4), (6, 7), (5, 1), (6, 1), (8, 1)]
The list after grouping by value : [[1, 2], [6], [5, 6, 8]]
Time complexity: O(n), where n is the number of tuples in the list.
Auxiliary space: O(n), where n is the number of tuples in the list, to store the grouped dictionary.
Share your thoughts in the comments
Please Login to comment...