Given a mixed list, the task is to write a Python program to group all the contiguous strings.
Input : test_list = [5, 6, 'g', 'f', 'g', 6, 5, 'i', 's', 8, 'be', 'st', 9] Output : [5, 6, ['g', 'f', 'g'], 6, 5, ['i', 's'], 8, ['be', 'st'], 9] Explanation : Strings are grouped to form result.
Input : test_list = [5, 6, 6, 5, 'i', 's', 8, 'be', 'st', 9] Output : [5, 6, 6, 5, ['i', 's'], 8, ['be', 'st'], 9] Explanation : Strings are grouped to form result.
Method 1: Using isinstance() + generator + groupby()
In this, we perform the task of identifying strings using isinstance() and str, groupby() is used to group all the strings found by key using isinstance(). The generator way of building a list helps to convert the intermediate results to a list.
Python3
# Python3 code to demonstrate working of # Group contiguous strings in List # Using isinstance() + generator + groupby() from itertools import groupby # checking string instance def str_check(ele): return isinstance (ele, str ) # Group contiguous strings def group_strs(test_list): # grouping list by cont. strings for key, grp in groupby(test_list, key = str_check): if key: yield list (grp) else : yield from grp # Initializing list test_list = [ 5 , 6 , 'g' , 'f' , 'g' , 6 , 5 , 'i' , 's' , 8 , 'be' , 'st' , 9 ] # Printing original list print ( "The original list is : " + str (test_list)) # Calling recursive method res = [ * group_strs(test_list)] # Printing result print ( "List after grouping : " + str (res)) |
The original list is : [5, 6, 'g', 'f', 'g', 6, 5, 'i', 's', 8, 'be', 'st', 9] List after grouping : [5, 6, ['g', 'f', 'g'], 6, 5, ['i', 's'], 8, ['be', 'st'], 9]
Time Complexity: O(n)
Auxiliary Space: O(n)
Method 2: Using type() and simple iteration
- Define a function named group_strs that takes a list test_list as input.
- Initialize an empty list called res.
- Initialize an empty list called temp.
- Use a for loop to iterate over each element ele in test_list.
- Check if the type of ele is str using the type() function.
- If the type of ele is str, append ele to temp.
- If the type of ele is not str, check if the length of temp is greater than 0 using the len() function.
- If the length of temp is greater than 0, append temp to res and reset temp to an empty list.
- Append ele to res.
- If the length of temp is greater than 0 after the loop has finished, append temp to res.
- Return the res list.
- Initialize a list called test_list with a mix of integers and strings.
- Print the original list test_list.
- Call the group_strs() function with test_list as the argument and assign the returned value to res.
- Print the new list res after grouping the strings together.
Example:
Python3
# Using loop def group_strs(test_list): res = [] temp = [] for ele in test_list: if type (ele) = = str : temp.append(ele) else : if len (temp) > 0 : res.append(temp) temp = [] res.append(ele) if len (temp) > 0 : res.append(temp) return res # initializing list test_list = [ 5 , 6 , 'g' , 'f' , 'g' , 6 , 5 , 'i' , 's' , 8 , 'be' , 'st' , 9 ] # printing original list print ( "The original list is : " + str (test_list)) # calling recursive function res = group_strs(test_list) # printing result print ( "List after grouping : " + str (res)) |
The original list is : [5, 6, 'g', 'f', 'g', 6, 5, 'i', 's', 8, 'be', 'st', 9] List after grouping : [5, 6, ['g', 'f', 'g'], 6, 5, ['i', 's'], 8, ['be', 'st'], 9]
Time complexity: O(n)
Auxiliary Space: O(n)
Method 3: Using itertools.groupby() function
Python3
# Python3 code to demonstrate working of # Group contiguous strings in List import itertools # Method to group contiguous strings def group_strs(test_list): res = [] for k, g in itertools.groupby(test_list, key = lambda x: isinstance (x, str )): if k: res.append(''.join( list (g))) else : res.extend( list (g)) return res # Initializing list test_list = [ 5 , 6 , 'g' , 'f' , 'g' , 6 , 5 , 'i' , 's' , 8 , 'be' , 'st' , 9 ] # Printing original list print ( "The original list is : " + str (test_list)) # Calling the function res = group_strs(test_list) # Printing list after grouping as result print ( "List after grouping : " + str (res)) |
The original list is : [5, 6, 'g', 'f', 'g', 6, 5, 'i', 's', 8, 'be', 'st', 9] List after grouping : [5, 6, 'gfg', 6, 5, 'is', 8, 'best', 9]
Time complexity: O(n), where n is the length of the input list.
Auxiliary space: O(n), where n is the length of the input list.
Method 4: Using a for loop and conditional statements.
Step-by-step approach:
- Create an empty list called “res” to store the grouped strings.
- Create an empty string called “temp” to store the current group of strings.
- Loop through each element in the “test_list”.
- Check if the element is a string by using the “isinstance()” function.
- If the element is a string, append it to the “temp” string.
- If the element is not a string, append the “temp” string to the “res” list if it is not empty.
- Append the current element to the “res” list.
- If the loop is finished and there are still strings in the “temp” string, append it to the “res” list.
- Return the “res” list.
Python3
def group_strs(test_list): res = [] temp = '' for ele in test_list: if isinstance (ele, str ): temp + = ele else : if temp: res.append(temp) temp = '' res.append(ele) if temp: res.append(temp) return res # initializing list test_list = [ 5 , 6 , 'g' , 'f' , 'g' , 6 , 5 , 'i' , 's' , 8 , 'be' , 'st' , 9 ] # printing original list print ( "The original list is : " + str (test_list)) # calling group_strs function res = group_strs(test_list) # printing result print ( "List after grouping : " + str (res)) |
The original list is : [5, 6, 'g', 'f', 'g', 6, 5, 'i', 's', 8, 'be', 'st', 9] List after grouping : [5, 6, 'gfg', 6, 5, 'is', 8, 'best', 9]
Time complexity: O(n), where n is the length of the “test_list”.
Auxiliary space: O(1), because we are using a constant amount of extra space for the “res” and “temp” variables.