The Wayback Machine - https://web.archive.org/web/20240118172614/https://www.geeksforgeeks.org/python-index-of-non-zero-elements-in-python-list/
Open In App
Related Articles

Python | Index of Non-Zero elements in Python list

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Report issue
Report

Sometimes, while working with python list, we can have a problem in which we need to find positions of all the integers other than 0. This can have application in day-day programming or competitive programming. Let’s discuss a shorthand by which we can perform this particular task. 

Method : Using enumerate() + list comprehension This method can be performed using combination of functionalities. In this, we use enumerate function to access index-element together and list comprehension is used for iteration and logic creation. 

Python3




# Python3 code to demonstrate working of
# Index of Non-Zero elements in Python list
# using list comprehension + enumerate()
 
# initialize list
test_list = [6, 7, 0, 1, 0, 2, 0, 12]
 
# printing original list
print("The original list is : " + str(test_list))
 
# Index of Non-Zero elements in Python list
# using list comprehension + enumerate()
res = [idx for idx, val in enumerate(test_list) if val != 0]
 
# printing result
print("Indices of Non-Zero elements : " + str(res))


Output : 

The original list is : [6, 7, 0, 1, 0, 2, 0, 12]
Indices of Non-Zero elements : [0, 1, 3, 5, 7]

Time Complexity: O(n), where n is the length of the list test_list 
Auxiliary Space: O(n) additional space of size n is created where n is the number of elements in the res list 

Using numpy: 

Note: Install numpy module using command “pip install numpy”

Use the numpy library to find the indices of non-zero elements in the list. Time complexity of this approach would be O(n) and space complexity would be O(n)

Python3




import numpy as np
 
# initialize list
test_list = [6, 7, 0, 1, 0, 2, 0, 12]
 
# printing original list
print("The original list is : " + str(test_list))
 
# Find the indices of non-zero elements using numpy
res = np.nonzero(test_list)[0]
 
# printing result
print("Indices of Non-Zero elements : " + str(res))
#This code is contributed by Edula Vinay Kumar Reddy


Output :
The original list is : [6, 7, 0, 1, 0, 2, 0, 12]
Indices of Non-Zero elements : [0 1 3 5 7]

This approach uses the numpy library’s nonzero() function to find the indices of non-zero elements in the list. Time complexity of this approach is O(n) and space complexity is O(n).

Method: Using a for loop

Python3




# Initializing list
test_list = [6, 7, 0, 1, 0, 2, 0, 12]
 
# Printing original list
print("The original list is : " + str(test_list))
 
# Index of Non-Zero elements in Python list
# using for loop
res = []
for i in range(len(test_list)):
    if test_list[i] != 0:
        res.append(i)
 
# Printing result
print("Indices of Non-Zero elements : " + str(res))
#This code is contributed by Vinay Pinjala.


Output

The original list is : [6, 7, 0, 1, 0, 2, 0, 12]
Indices of Non-Zero elements : [0, 1, 3, 5, 7]

Time Complexity: O(n)
Auxiliary Space: O(n)

Method 4: Using filter() function

The filter() function can be used to filter out the non-zero elements and return the indices of the remaining elements.

Step-by-step approach:

  • Define a function that takes an element and its index as input and returns True if the element is non-zero, else False.
  • Apply the filter() function on the enumerated test_list with the above-defined function.
  • Convert the filtered output to a list and extract the indices using the map() function.
  • Print the indices of non-zero elements

Python3




# Python3 code to demonstrate working of
# Index of Non-Zero elements in Python list
# using filter() function
 
# initialize list
test_list = [6, 7, 0, 1, 0, 2, 0, 12]
 
# printing original list
print("The original list is : " + str(test_list))
 
# function to filter non-zero elements
def filter_non_zero(elem):
    return elem[1] != 0
 
# Index of Non-Zero elements in Python list
# using filter() function
filtered_output = filter(filter_non_zero, enumerate(test_list))
res = list(map(lambda x: x[0], filtered_output))
 
# printing result
print("Indices of Non-Zero elements : " + str(res))


Output

The original list is : [6, 7, 0, 1, 0, 2, 0, 12]
Indices of Non-Zero elements : [0, 1, 3, 5, 7]

Time complexity: O(n), where n is the length of the input list.
Auxiliary space: O(1), as the space used is constant, and does not depend on the size of the input.

Method 5: Using the Itertools Module:

  1. Initialize the input list with some elements.
  2. Print the original input list to the console.
  3. Import the compress() function from the itertools module.
  4. Create a Boolean mask where True corresponds to non-zero elements in the input list.
  5. Use the compress() function to get an iterator object that returns only the elements from the input list that correspond to a True value in the Boolean mask.
  6. Convert the iterator object to a list and store it in a variable.
  7. Print the list of indices of non-zero elements to the console.

Python3




from itertools import compress
 
# initialize list
test_list = [6, 7, 0, 1, 0, 2, 0, 12]
 
# printing original list
print("The original list is : " + str(test_list))
 
# using itertools.compress() to get the indices of non-zero elements
non_zero_indices = list(compress(range(len(test_list)), test_list))
 
# printing result
print("Indices of Non-Zero elements : " + str(non_zero_indices))
#This code is contributed by Jyothi pinjala.


Output

The original list is : [6, 7, 0, 1, 0, 2, 0, 12]
Indices of Non-Zero elements : [0, 1, 3, 5, 7]

Time Complexity:
The compress() function works in linear time, O(n), where n is the length of the input list. Therefore, the overall time complexity of the algorithm is also O(n).

Auxiliary Space:
The algorithm uses an additional list to store the indices of non-zero elements. The size of this list is proportional to the number of non-zero elements in the input list, which is at most n. Therefore, the space complexity of the algorithm is O(n).

Method 6:  Using a lambda function with the map() function

  1. Initialize a list test_list with values [6, 7, 0, 1, 0, 2, 0, 12].
  2. Use the enumerate() function to generate a sequence of (index, value) pairs for each element in the list. This generates a new sequence [(0, 6), (1, 7), (2, 0), (3, 1), (4, 0), (5, 2), (6, 0), (7, 12)].
  3. Use the filter() function to keep only the pairs where the value is non-zero. This filters the sequence to (0, 6), (1, 7), (3, 1), (5, 2), (7, 12).
  4. Use the map() function to extract the index value from each pair. A lambda function is used to take the first element of each pair. This returns a new sequence [0, 1, 3, 5, 7].
  5. Convert the resulting sequence of indices to a list and store it in the variable res.
  6. Print the list of indices using the print() function.

Python3




test_list = [6, 7, 0, 1, 0, 2, 0, 12]
res = list(map(lambda x: x[0], filter(lambda x: x[1] != 0, enumerate(test_list))))
print("Indices of Non-Zero elements : " + str(res))


Output

Indices of Non-Zero elements : [0, 1, 3, 5, 7]

The time complexity of this method is O(n), where n is the length of the input list. 
The auxiliary space complexity is O(n) as well, due to the use of the filter and map functions to generate a new list.


Don't miss your chance to ride the wave of the data revolution! Every industry is scaling new heights by tapping into the power of data. Sharpen your skills, become a part of the hottest trend in the 21st century.
Dive into the future of technology - explore the Complete Machine Learning and Data Science Program by GeeksforGeeks and stay ahead of the curve.

Commit to GfG's Three-90 Challenge! Purchase a course, complete 90% in 90 days, and save 90% cost click here to explore.
Last Updated : 09 May, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads
Complete Tutorials