Sometimes, while working with Python Strings, we can have a problem in which we need to perform Grouping of Python Strings on the basis of its Kth character. This kind of problem can come in day-day programming. Let’s discuss certain ways in which this task can be performed.
Method #1: Using loop
This is one way in which this task can be performed. In this, we perform the task of grouping using a brute force approach. We iterate each string, and group the dictionary after a conditional check using a conditional statement.
Python3
# Python3 code to demonstrate working of # Groups Strings on Kth character # Using loop from collections import defaultdict # initializing list test_list = [ "gfg" , "is" , "best" , "for" , "neveropen" ] # printing original list print ( "The original list is : " + str (test_list)) # initializing K K = 2 # Groups Strings on Kth character # Using loop res = defaultdict( list ) for word in test_list: res[word[K - 1 ]].append(word) # printing result print ( "The strings grouping : " + str ( dict (res))) |
The original list is : [‘gfg’, ‘is’, ‘best’, ‘for’, ‘neveropen’] The strings grouping : {‘f’: [‘gfg’], ‘s’: [‘is’], ‘e’: [‘best’, ‘neveropen’], ‘o’: [‘for’]}
Time complexity: O(n), where n is the number of elements in the test_list.
Auxiliary space: O(n), where n is the number of elements in the test_list.
Method #2: Using map() + loop
This is yet another way to solve this problem. In this variant, additional test of valid character is added using map().
Python3
# Python3 code to demonstrate working of # Groups Strings on Kth character # Using loop + map() # initializing list test_list = [ "gfg" , "is" , "best" , "for" , "neveropen" ] # printing original list print ( "The original list is : " + str (test_list)) # initializing K K = 2 # Groups Strings on Kth character # Using loop + map() res = dict () for char in map ( chr , range ( 97 , 123 )): words = [idx for idx in test_list if idx[K - 1 ] = = char] if words: res[char] = words # printing result print ( "The strings grouping : " + str (res)) |
The original list is : [‘gfg’, ‘is’, ‘best’, ‘for’, ‘neveropen’] The strings grouping : {‘f’: [‘gfg’], ‘s’: [‘is’], ‘e’: [‘best’, ‘neveropen’], ‘o’: [‘for’]}
Time Complexity: O(N*N) where n is the number of elements in the dictionary. map() + loop is used to perform the task and it takes O(n*n) time.
Auxiliary Space: O(N) additional space of size n is created where n is the number of elements in the dictionary.
Method #3: Using list comprehension
- Initializing list
- Printing original list
- Initializing K
- Groups Strings on Kth character Using list comprehension
- Printing result
Python3
# Python3 code to demonstrate working of # Groups Strings on Kth character # Using list comprehension from collections import defaultdict # initializing list test_list = [ "gfg" , "is" , "best" , "for" , "neveropen" ] # printing original list print ( "The original list is : " + str (test_list)) # initializing K K = 2 # Groups Strings on Kth character # Using list comprehension res = defaultdict( list ) [res[word[K - 1 ]].append(word) for word in test_list] # printing result print ( "The strings grouping : " + str ( dict (res))) |
The original list is : ['gfg', 'is', 'best', 'for', 'neveropen'] The strings grouping : {'f': ['gfg'], 's': ['is'], 'e': ['best', 'neveropen'], 'o': ['for']}
Time complexity: O(n), where n is the number of words in the input list.
Auxiliary space: O(kn), where k is the number of unique Kth characters and n is the number of words in the input list.
Method 4: Using itertools.groupby() method
Python3
from itertools import groupby from operator import itemgetter from collections import defaultdict # initializing list test_list = [ "gfg" , "is" , "best" , "for" , "neveropen" ] # printing original list print ( "The original list is : " + str (test_list)) # initializing K K = 2 # Groups Strings on Kth character # Using itertools.groupby() test_list.sort(key = lambda x: x[K - 1 ]) res = defaultdict( list ) for k, g in groupby(test_list, key = itemgetter(K - 1 )): res[k].extend(g) # printing result print ( "The strings grouping : " + str ( dict (res))) |
The original list is : ['gfg', 'is', 'best', 'for', 'neveropen'] The strings grouping : {'e': ['best', 'neveropen'], 'f': ['gfg'], 'o': ['for'], 's': ['is']}
Time complexity: O(NlogN), where N is the length of the input list.
Auxiliary space: O(N), due to the creation of a defaultdict and a sorted copy of the input list.