Python - Group contiguous strings in List
Last Updated :
08 May, 2023
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))
OutputThe 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))
OutputThe 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))
OutputThe 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))
OutputThe 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.