Sometimes, while working with data, we can have a problem in which we need to perform construction of string in a way that we have a list of tuple having character and it’s corresponding frequency and we require to construct a new string from that. Let’s discuss certain ways in which this task can be performed.
Method #1 : Using loop This is brute force method in which this task can be performed. In this, we iterate the list and perform string concatenation using * operator and keep building string this way.
# Python3 code to demonstrate working of # String construction from character frequency # using loop # initialize list test_list = [( 'g' , 4 ), ( 'f' , 3 ), ( 'g' , 2 )]
# printing original list print ( "The original list : " + str (test_list))
# String construction from character frequency # using loop res = ''
for char, freq in test_list:
res = res + char * freq
# printing result print ( "The constructed string is : " + str (res))
|
The original list : [('g', 4), ('f', 3), ('g', 2)] The constructed string is : ggggfffgg
Time Complexity: O(n)
Auxiliary Space: O(n)
Method #2 : Using join() + list comprehension The combination of above functionalities can be used to perform this task. In this, we perform the task of extraction using list comprehension and making string using join().
# Python3 code to demonstrate working of # String construction from character frequency # using join() + list comprehension # initialize list test_list = [( 'g' , 4 ), ( 'f' , 3 ), ( 'g' , 2 )]
# printing original list print ( "The original list : " + str (test_list))
# String construction from character frequency # using join() + list comprehension res = ''.join(char * freq for char, freq in test_list)
# printing result print ( "The constructed string is : " + str (res))
|
The original list : [('g', 4), ('f', 3), ('g', 2)] The constructed string is : ggggfffgg
Time Complexity: O(n)
Auxiliary Space: O(n)
Method #3 : Using reduce()
# Python3 code to demonstrate working of # String construction from character frequency # using reduce() # importing functools for reduce() import functools
# initialize list test_list = [( 'g' , 4 ), ( 'f' , 3 ), ( 'g' , 2 )]
# printing original list print ( "The original list : " + str (test_list))
# String construction from character frequency # using reduce() res = functools. reduce ( lambda x, y : x + y[ 0 ] * y[ 1 ], test_list, '')
# printing result print ( "The constructed string is : " + str (res))
#this code is contributed by edula vinay kumar reddy |
The original list : [('g', 4), ('f', 3), ('g', 2)] The constructed string is : ggggfffgg
Time Complexity: O(n)
Auxiliary Space: O(n)
Method #4: Using the map() function and lambda function
# Initialize the character frequency tuple char_freq = (( 'g' , 4 ), ( 'f' , 3 ), ( 'g' , 2 ))
# Use the map function to repeat the characters my_list = list ( map ( lambda x: x[ 0 ] * x[ 1 ], char_freq))
# Use the join method to convert the list to a string my_string = "".join(my_list)
# Print the constructed string print (my_string)
# This code is contributed by Vinay Pinjala. |
ggggfffgg
Time Complexity: O(n)
Auxiliary Space: O(n)
Method 5: Use the itertools module.
Step-by-step approach:
- Import the itertools module.
- Use a list comprehension with the itertools.repeat() function to repeat each character by the given frequency.
- Use the itertools.chain.from_iterable() function to combine the repeated character strings into a single iterable.
- Use the str.join() method to convert the iterable into a string.
- Print the constructed string.
Below is the implementation of the above approach:
import itertools
# Initialize the character frequency tuple char_freq = (( 'g' , 4 ), ( 'f' , 3 ), ( 'g' , 2 ))
# Use itertools to repeat the characters and combine them into a single iterable my_iterable = itertools.chain.from_iterable(itertools.repeat(c, f) for c, f in char_freq)
# Use join to convert the iterable into a string my_string = ''.join(my_iterable)
# Print the constructed string print (my_string)
|
ggggfffgg
Time complexity: O(n), where n is the total number of characters to be repeated.
Auxiliary space: O(n), where n is the total number of characters to be repeated, since we need to store the repeated character strings in memory before joining them into a single iterable.
Method 6: Using the numpy.repeat() function along with the join() function:
Steps:
- Import the numpy module.
- Convert the char_freq tuple into a numpy array using the numpy.array() function.
- Extract the characters and their frequencies into separate arrays using indexing.
- Use the numpy.repeat() function to repeat each character by its frequency.
- Concatenate the repeated characters using the numpy.concatenate() function.
- Convert the concatenated array into a string using the join() function.
- Print the constructed string.
Below is the implementation of the above approach:
import numpy as np
char_freq = (( 'g' , 4 ), ( 'f' , 3 ), ( 'g' , 2 ))
# Convert the char_freq tuple # into a numpy array char_freq_arr = np.array(char_freq)
# Extract the characters and their # frequencies into separate arrays chars = char_freq_arr[:, 0 ]
freqs = char_freq_arr[:, 1 ].astype( int )
# Repeat each character by its frequency # using numpy.repeat() repeated_chars = np.repeat(chars, freqs)
# Concatenate the repeated characters # using numpy.concatenate() concatenated_chars = np.concatenate([repeated_chars])
# Convert the concatenated array into # a string using join() my_string = ''.join(concatenated_chars)
# Print the constructed string print (my_string)
|
Output:
ggggfffgg
Time Complexity: O(N), where N is the total number of characters in the constructed string.
Auxiliary Space: O(N), where N is the total number of characters in the constructed string.