Grouper recipe is an extended toolset made using an existing itertool as building blocks. It collects data into fixed-length chunks or blocks. Existing Itertools Used: izip_longest(*iterables[, fillvalue]) : Make an iterator that aggregates elements from each of the iterables. If the iterables are of uneven length, missing values are filled-in with fillvalue. Iteration continues until the longest iterable is exhausted. Performance:
- The extended tools offer the same high performance as the underlying toolset.
- The superior memory performance is kept by processing elements one at a time rather than bringing the whole iterable into memory all at once.
- Code volume is kept small by linking the tools together in a functional style which helps eliminate temporary variables.
- High speed is retained by preferring “vectorized” building blocks over the use of for-loops and generators which incur interpreter overhead.
Examples:
Input : str = ABCDEFG, l = 3 Output : ABC DEF Gxx Explanation: Grouping characters of string in set of 3: ABC DEF Gxx. 'x' is added to the set which doesn't have 3 elements in it. Input : str = GEEKSFORGEEKS, l = 5 Output : GEEKS FORGE EKSxx
Below is the Python3 code :
Python3
# Python3 code for the grouper recipe # import the existing itertool izip_longest from itertools import izip_longest # function for the grouper recipe def grouper(iterable, n, fillvalue = 'x' ): # create 'n'-blocks for collection args = [ iter (iterable)] * n # collect data into fixed length blocks of # length 'n' using izip_longest and store # result as a list ans = list (izip_longest(fillvalue = fillvalue, * args)) # (optional) loop to convert ans to string t = len (ans) for i in range (t): ans[i] = "".join(ans[i]) # return ans as string return " ".join(ans) # Driver code s = "ABCDEFG" k = 3 result = grouper(s, k) print (result) |
Output:
ABC DEF Gxx
The time complexity and auxiliary space of the above code are:
Time complexity: O(n), where n is the length of the input iterable.