web-dev-qa-db-fra.com

Python trouve la première instance d'un nombre non nul dans la liste

J'ai une liste comme celle-ci

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

Je voudrais trouver l'emplacement du premier numéro de la liste qui n'est pas égal à zéro.

myList.index(2.0)

Fonctionne dans cet exemple, mais parfois le premier nombre non nul sera 1 ou 3.

Y a-t-il un moyen rapide de faire cela?

21
user2333196

Utilisez next avec 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
44
Ashwini Chaudhary

Utiliser filtrer

>>> myList.index(filter(lambda x: x!=0, myList)[0])
3
13
Puffin GDI

Voici un one-liner pour le faire:

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

Fondamentalement, il utilise next () pour trouver la première valeur, ou renvoie None s'il n'en a pas. enumerate () est utilisé pour créer un itérateur qui itère sur un index, une valeur de tuples afin que nous connaissions l'index auquel nous nous trouvons.

5
Murph

Utiliser next avec enumerate est excellent lorsque le tableau est grand. Pour les tableaux plus petits, j'utiliserais argmax à partir de numpy pour ne pas avoir besoin d'une boucle:

import numpy as np

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

Vous pouvez utiliser numpy.nonzero: http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.nonzero.html

myList = [0.0 , 0.0, 0.0, 2.0, 2.0]
I = np.nonzero(myList)
#the first index is necessary because the vector is within a Tuple
first_non_zero_index = I[0][0]
#3
2
Rodrigo Ferreira

Comment ça marche:

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

Qu'en est-il d'utiliser énumérer? Vérifiez la documentation énumérer .

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

Que diriez-vous de suivre:

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

Ceci est plus pratique car, en plus de rechercher des valeurs non nulles, cela peut également aider à appliquer directement une fonction logique. Par exemple: 

print (np.nonzero(np.array(myList)>1))
0
devil in the detail

Utilisez simplement une compréhension de liste:

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

Les indices des éléments non nuls sont myDict[element].

0
Rushy Panchal