Python – Find minimum of non zero groups
Many times we need to get the minimum of not the whole list but just a part of it and at regular intervals. These intervals are sometimes decided statically before traversal, but sometimes, the constraint is more dynamic and hence we require to handle it in more complex way. Criteria discussed here is minimum of non-zero groups. Let’s discuss certain ways in which this task can be done.
Method #1 : Using loops This task can be performed using the brute force manner using the loops. We just traverse the list each element to test for it’s succeeding element to be non-zero value and perform the minimum once we find a next value to be zero and append it in result list.
Python3
test_list = [ 4 , 9 , 0 , 0 , 3 , 4 , 5 , 0 , 0 , 4 , 0 ]
print ("The original list : " + str (test_list))
res = []
val = 99999
for ele in test_list:
if ele = = 0 :
if val ! = 99999 :
res.append(val)
val = 99999
else :
val = min (val, ele)
print ("The non - zero group Minimum of list is : " + str (res))
|
Output :
The original list : [4, 9, 0, 0, 3, 4, 5, 0, 0, 4, 0]
The non-zero group Minimum of list is : [4, 3, 4]
Method #2: Using itertools.groupby() + min() This particular task can also be performed using groupby function to group all the non-zero values and min function can be used to perform their minimum.
Python3
from itertools import groupby
test_list = [ 4 , 9 , 0 , 0 , 3 , 4 , 5 , 0 , 0 , 4 , 0 ]
print ("The original list : " + str (test_list))
res = [ min (val) for keys, val in groupby(test_list, key = lambda x: x ! = 0 ) if keys ! = 0 ]
print ("The non - zero group minimum of list is : " + str (res))
|
Output :
The original list : [4, 9, 0, 0, 3, 4, 5, 0, 0, 4, 0]
The non-zero group Minimum of list is : [4, 3, 4]
Method #3: Using a list comprehension to find non-zero groups:
Step-by-step approach:
- Convert the list of integers to a string: O(n)
- Use str.join to concatenate the elements of the list into a single string: O(n)
- Use str.split to split the string at every occurrence of ‘0’: O(n)
- Filter out any empty groups: O(n)
- Convert each group back to a list of integers: O(n)
- Use a list comprehension to find the minimum value in each group: O(n)
- Return the list of minimum values: O(n)
Python3
def min_nonzero_groups_3(lst):
groups = [ list (group) for group in ' '.join(map(str, lst)).split(' 0 ') if group]
return [ min (group) for group in groups]
lst = [ 4 , 9 , 0 , 0 , 3 , 4 , 5 , 0 , 0 , 4 , 0 ]
print (min_nonzero_groups_3(lst))
|
Time complexity: O(n)
Auxiliary space: O(n)
Method 4: Using the numpy library.
Step-by-step approach:
- Import the numpy library.
- Convert the given list into a numpy array.
- Get the indices of non-zero elements in the array.
- Get the indices where consecutive elements differ by 1 (i.e., indices of the end of each non-zero group).
- Get the start and end indices of each non-zero group by adding the first and last indices.
- Using a list comprehension, calculate the minimum value for each group.
- Print the result.
Python3
import numpy as np
test_list = [ 4 , 9 , 0 , 0 , 3 , 4 , 5 , 0 , 0 , 4 , 0 ]
arr = np.array(test_list)
indices = np.nonzero(arr)[ 0 ]
diff_indices = np.where(np.diff(indices) ! = 1 )[ 0 ]
start_indices = np.append(indices[ 0 ], indices[diff_indices + 1 ])
end_indices = np.append(indices[diff_indices], indices[ - 1 ])
min_vals = np.array([np. min (arr[start:end + 1 ]) for start, end in zip (start_indices, end_indices)])
print ( "The non-zero group minimum of list is : " + str ( list (min_vals)))
|
Output:
The non-zero group minimum of list is : [4, 3, 4]
Time complexity: O(n), where n is the length of the input list, because we are performing a constant number of operations for each non-zero group.
Auxiliary space: O(n), where n is the length of the input list, because we are storing the indices of non-zero elements and the start and end indices of each non-zero group.
Last Updated :
02 May, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...