 GeeksforGeeks App
Open App Browser
Continue

# 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

 `# 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.

My Personal Notes arrow_drop_up