Python | Construct string from character frequency tuple
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))
# 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))
# 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
# 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
Output
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.
# 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.
Output
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)
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)
Output
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.