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 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:
# 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 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.
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.