Open In App

Python – Find minimum of non zero groups

Improve
Improve
Like Article
Like
Save
Share
Report

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




# Python3 code to demonstrate
# Natural Numbers Minimum
# Using loops
 
# initializing list
test_list = [4, 9, 0, 0, 3, 4, 5, 0, 0, 4, 0]
 
# printing original list
print("The original list : " + str(test_list))
 
# using loops
# Natural Numbers Minimum
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 result
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




# Python3 code to demonstrate
# Natural Numbers Minimum
# Using itertools.groupby() + min()
from itertools import groupby
 
# initializing list
test_list = [4, 9, 0, 0, 3, 4, 5, 0, 0, 4, 0]
 
# printing original list
print("The original list : " + str(test_list))
 
# using itertools.groupby() + min()
# Natural Numbers Minimum
res = [min(val) for keys, val in groupby(test_list, key = lambda x: x != 0) if keys != 0]
 
# print result
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]
 
# Example usage:
lst = [4, 9, 0, 0, 3, 4, 5, 0, 0, 4, 0]
print(min_nonzero_groups_3(lst))  # Output: [4, 3, 4]


Output

['4', '3', '4']

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




# Python3 code to demonstrate
# Natural Numbers Minimum
# Using numpy
 
import numpy as np
 
# initializing list
test_list = [4, 9, 0, 0, 3, 4, 5, 0, 0, 4, 0]
 
# converting list to numpy array
arr = np.array(test_list)
 
# getting indices of non-zero elements
indices = np.nonzero(arr)[0]
 
# getting indices where consecutive elements differ by 1
diff_indices = np.where(np.diff(indices) != 1)[0]
 
# adding first and last indices
start_indices = np.append(indices[0], indices[diff_indices + 1])
end_indices = np.append(indices[diff_indices], indices[-1])
 
# getting minimum values for each group
min_vals = np.array([np.min(arr[start:end+1]) for start, end in zip(start_indices, end_indices)])
 
# print result
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
Previous
Next
Share your thoughts in the comments
Similar Reads