Open In App

Python – Case Insensitive Strings Grouping

Improve
Improve
Like Article
Like
Save
Share
Report

Sometimes, we have a use case in which we need to perform the grouping of strings by various factors, like first letter or any other factor. These type of problems are typical to database queries and hence can occur in web development while programming. This article focuses on one such grouping by case insensitivity i.e grouping all strings which are same but have different cases. Let’s discuss certain ways in which this can be performed. 

Method #1 : Using next() + lambda + loop The combination of above 3 functions is used to solve this particular problem by the naive method. The lambda function performs the task of finding like cases, and next function helps in forward iteration. 

Python3




# Python3 code to demonstrate
# Case Insensitive Strings Grouping
# using next() + lambda + loop
 
# initializing list
test_list = ['man', 'a', 'gEek', 'for', 'GEEK', 'FoR']
 
# printing original list
print("The original list : " + str(test_list))
 
# using next() + lambda + loop
# Case Insensitive Strings Grouping
util_func = lambda x, y: str.lower(x) == str.lower(y)
res = []
for sub in test_list:
    ele = next((x for x in res if util_func(sub, x[0])), [])
    if ele == []:
        res.append(ele)
    ele.append(sub)
 
# print result
print("The list after Categorization : " + str(res))


Output : 

The original list : ['man', 'a', 'gEek', 'for', 'GEEK', 'FoR']
The list after Categorization : [['man'], ['a'], ['gEek', 'GEEK'], ['for', 'FoR']]

Time Complexity: O(n*n), where n is the number of elements in the list “test_list”.
Auxiliary Space: O(n), where n is the number of elements in the list “test_list”.

  Method #2 : Using sorted() + groupby() This particular task can also be solved using the groupby function which offers a conventional method to solve this problem. The sorted function sorts the elements by size to be feed to groupby for the relevant grouping. 

Python3




# Python3 code to demonstrate
# Case Insensitive Strings Grouping
# using sorted() + groupby()
from itertools import groupby
 
# initializing list
test_list = ['man', 'a', 'gEek', 'for', 'GEEK', 'FoR']
 
# printing original list
print("The original list : " + str(test_list))
 
# using sorted() + groupby()
# Case Insensitive Strings Grouping
util_func = lambda x: str.lower(x)
temp = sorted(test_list, key = util_func)
res = [list(ele) for i, ele in groupby(temp, util_func)]
 
# print result
print("The list after Categorization : " + str(res))


Output : 

The original list : ['man', 'a', 'gEek', 'for', 'GEEK', 'FoR']
The list after Categorization : [['man'], ['a'], ['gEek', 'GEEK'], ['for', 'FoR']]

Time Complexity: O(n*logn), where n is length of test_list.

Auxiliary Space: O(m), where m is length of res list.

Method #3 : Using Dictionary

Python3




# Python3 code to demonstrate
# Case Insensitive Strings Grouping
res = {}
# initializing list
test_list = ['man', 'a', 'gEek', 'for', 'GEEK', 'FoR']
 
# printing original list
print("The original list : " + str(test_list))
 
for i in test_list:
    if i.lower() in res.keys():
        res[i.lower()].append(i)
    else:
        res[i.lower()] = [i]
# print result
print("The list after Categorization : " + str(list(res.values())))


Output

The original list : ['man', 'a', 'gEek', 'for', 'GEEK', 'FoR']
The list after Categorization : [['man'], ['a'], ['gEek', 'GEEK'], ['for', 'FoR']]

Method #4 : Using reduce

In this method we iterates over each element of the test_list using reduce. The lambda function checks whether the lowercase version of the current element exists in the keys. If it does, the current element is appended to the value of the corresponding key. If it doesn’t, a new key is created in the list using the lowercase version of the current element and its value is set to a list containing the current element. Finally, the list of values in the list is returned using the list() function.

Python3




# Python3 code to demonstrate
# Case Insensitive Strings Grouping
from functools import reduce
 
# initializing list
test_list = ['man', 'a', 'gEek', 'for', 'GEEK', 'FoR']
 
# printing original list
print("The original list : " + str(test_list))
 
# Case Insensitive Strings Grouping using reduce() + lambda function
res = reduce(lambda x, y: (x.update({y.lower(): x.get(y.lower(), []) + [y]})) or x, test_list, {})
 
# print result
print("The list after Categorization : " + str(list(res.values())))


Output

The original list : ['man', 'a', 'gEek', 'for', 'GEEK', 'FoR']
The list after Categorization : [['man'], ['a'], ['gEek', 'GEEK'], ['for', 'FoR']]

Time Complexity: O(n), where n is the number of elements in the test_list
Auxiliary Space: O(n), because it creates a dictionary to store the categorized elements, and the size of the dictionary grows with the number of elements in the input list.



Last Updated : 16 May, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads