Given List of tuples, group 1st elements on basis of 2nd elements.
Input : test_list = [(6, 5), (2, 7), (2, 5), (8, 7), (3, 7)]
Output : {5: [6, 2], 7: [2, 8, 3]}
Explanation : 5 occurs along with 6 and 2 in tuple list, hence grouping.
Input : test_list = [(6, 5), (2, 7), (2, 5), (8, 7)]
Output : {5: [6, 2], 7: [2, 8]}
Explanation : 5 occurs along with 6 and 2 in tuple list, hence grouping.
Method #1 : Using loop + groupby() + sorted() + list comprehension + lambda
In this, the elements are sorted for grouping, function provided by lambda, then only first elements are extracted using list comprehension out of result. And final dictionary formation using loop.
Python3
from itertools import groupby
test_list = [( 6 , 5 ), ( 2 , 7 ), ( 2 , 5 ), ( 8 , 7 ), ( 9 , 8 ), ( 3 , 7 )]
print ( "The original list is : " + str (test_list))
res = dict ()
for key, val in groupby( sorted (test_list, key = lambda ele: ele[ 1 ]), key = lambda ele: ele[ 1 ]):
res[key] = [ele[ 0 ] for ele in val]
print ( "Grouped Dictionary : " + str (res))
|
Output
The original list is : [(6, 5), (2, 7), (2, 5), (8, 7), (9, 8), (3, 7)]
Grouped Dictionary : {5: [6, 2], 7: [2, 8, 3], 8: [9]}
Time Complexity: O(n)
Auxiliary Space: O(n)
Method #2 : Using dictionary comprehension
This is method similar to above, just a one-liner shorthand handled using dictionary comprehension.
Python3
from itertools import groupby
test_list = [( 6 , 5 ), ( 2 , 7 ), ( 2 , 5 ), ( 8 , 7 ), ( 9 , 8 ), ( 3 , 7 )]
print ( "The original list is : " + str (test_list))
res = {key: [v[ 0 ] for v in val] for key, val in groupby(
sorted (test_list, key = lambda ele: ele[ 1 ]), key = lambda ele: ele[ 1 ])}
print ( "Grouped Dictionary : " + str (res))
|
Output
The original list is : [(6, 5), (2, 7), (2, 5), (8, 7), (9, 8), (3, 7)]
Grouped Dictionary : {5: [6, 2], 7: [2, 8, 3], 8: [9]}
Time Complexity: O(nlogn) for sorting the list, where n is the length of the input list.
Auxiliary Space: O(n) for storing the dictionary.
Method #3 : Using for loop , in and not in operators
Python3
test_list = [( 6 , 5 ), ( 2 , 7 ), ( 2 , 5 ), ( 8 , 7 ), ( 9 , 8 ), ( 3 , 7 )]
print ( "The original list is : " + str (test_list))
res = dict ()
x = []
for i in test_list:
if i[ 1 ] not in x:
x.append(i[ 1 ])
for i in x:
p = []
for j in test_list:
if j[ 1 ] = = i:
p.append(j[ 0 ])
res[i] = p
print ( "Grouped Dictionary : " + str (res))
|
Output
The original list is : [(6, 5), (2, 7), (2, 5), (8, 7), (9, 8), (3, 7)]
Grouped Dictionary : {5: [6, 2], 7: [2, 8, 3], 8: [9]}
Time complexity: O(n^2)
Auxiliary space: O(n)
Method #4: Using defaultdict
Use the defaultdict from the collections module to group the first elements by the second elements in a tuple list.
Step-by-step approach:
- Import the defaultdict class from the collections module.
- Initialize a defaultdict with a list as the default value.
- Loop through each tuple in the input list, and append the first element of the tuple to the list associated with the second element of the tuple in the defaultdict.
- Return the resulting defaultdict as a regular dictionary.
Below is the implementation of the above approach:
Python3
from collections import defaultdict
test_list = [( 6 , 5 ), ( 2 , 7 ), ( 2 , 5 ), ( 8 , 7 ), ( 9 , 8 ), ( 3 , 7 )]
print ( "The original list is : " + str (test_list))
res = defaultdict( list )
for key, val in test_list:
res[val].append(key)
res = dict (res)
print ( "Grouped Dictionary : " + str (res))
|
Output
The original list is : [(6, 5), (2, 7), (2, 5), (8, 7), (9, 8), (3, 7)]
Grouped Dictionary : {5: [6, 2], 7: [2, 8, 3], 8: [9]}
Time Complexity: O(n), where n is the length of the input list.
Auxiliary Space: O(n), to store the defaultdict.
Method #6: Using pandas
Use pandas to group the tuples by their second element and get the corresponding first elements as a list.
Step-by-step approach:
- Import the pandas library.
- Convert the list of tuples to a pandas DataFrame.
- Set the second element of each tuple as the index of the DataFrame.
- Group the DataFrame by the index and aggregate the first elements of each tuple into a list.
- Convert the resulting pandas Series back to a dictionary.
- Print the resulting grouped dictionary.
Below is the implementation of the above approach:
Python3
import pandas as pd
test_list = [( 6 , 5 ), ( 2 , 7 ), ( 2 , 5 ), ( 8 , 7 ), ( 9 , 8 ), ( 3 , 7 )]
df = pd.DataFrame(test_list, columns = [ 'first' , 'second' ])
grouped = df.groupby( 'second' )[ 'first' ].agg( list )
grouped_dict = grouped.to_dict()
print ( "Grouped Dictionary : " + str (grouped_dict))
|
Output:
Grouped Dictionary : {5: [6, 2], 7: [2, 8, 3], 8: [9]}
Time complexity: O(n log n), where n is the length of the input list.
Auxiliary space: O(n), where n is the length of the input 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!
Last Updated :
17 Apr, 2023
Like Article
Save Article