Python находит первый экземпляр ненулевого числа в списке

У меня есть такой список

myList = [0.0 , 0.0, 0.0, 2.0, 2.0]

Я хотел бы найти местоположение первого числа в списке, которое не равно нулю.

myList.index(2.0)

Работает в этом примере, но иногда первое ненулевое число будет 1 или 3.

Есть ли быстрый способ сделать это?

Ответ 1

Используйте next с enumerate:

>>> myList = [0.0 , 0.0, 0.0, 2.0, 2.0]
>>> next((i for i, x in enumerate(myList) if x), None) # x!= 0 for strict match
3

Ответ 2

Использовать фильтр

Python 2:

myList = [0.0, 0.0, 0.0, 2.0, 2.0]
myList2 = [0.0, 0.0]

myList.index(filter(lambda x: x!=0, myList)[0])       # 3
myList2.index(filter(lambda x: x!=0, myList2)[0])     # IndexError

Python 3: (Спасибо за комментарий Матиаса):

myList.index(next(filter(lambda x: x!=0, myList)))    # 3
myList2.index(next(filter(lambda x: x!=0, myList2)))  # StopIteration
# from Ashwini Chaudhary answer
next((i for i, x in enumerate(myList) if x), None)    # 3
next((i for i, x in enumerate(myList2) if x), None)   # None

Вы должны справиться с особым случаем.

Ответ 3

Вот один лайнер, чтобы сделать это:

val = next((index for index,value in enumerate(myList) if value != 0), None)

По сути, он использует next(), чтобы найти первое значение, или возвращает None если его нет. enumerate() используется для создания итератора, который выполняет итерации по индексу, значениям кортежей, чтобы мы знали индекс, по которому мы находимся.

Ответ 4

Использование next с enumerate отлично, когда массив большой. Для меньших массивов я использовал бы argmax из numpy, так что вам не понадобится цикл:

import numpy as np

myList = [0.0, 0.0, 0.0, 2.0, 2.0]
myArray = np.array(myList)
np.argmax(myArray > 0)
3

Ответ 6

Как это:

[i for i, x in enumerate(myList) if x][0]

Ответ 7

Как насчет использования перечисления? Проверьте документацию enumerate.

def first_non_zero(mylist):
  for index, number in enumerate(mylist):
    if number != 0: # or 'if number:'
      return index

Ответ 8

Просто используйте понимание списка:

myDict = {x: index for index, x in enumerate(myList) if x}

Индексы ненулевых элементов myDict[element].

Ответ 9

Как насчет сделать следующее:

print (np.nonzero(np.array(myList))[0][0])

Это более удобно, поскольку наряду с поиском ненулевых значений это также может помочь непосредственно применить логическую функцию. Например:

print (np.nonzero(np.array(myList)>1))