Tengo una parte de mi código donde se supone que debo crear una centralita. Quiero devolver una lista de todos los interruptores que están encendidos. Aquí "on" será igual True
y "off" igual False
. Así que ahora solo quiero devolver una lista de todos los True
valores y su posición. Esto es todo lo que tengo, pero solo devuelve la posición de la primera aparición de True
(esto es solo una parte de mi código):
self.states = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False]
def which_switch(self):
x = [self.states.index(i) for i in self.states if i == True]
Esto solo devuelve "4"
x
, luego loenumerate(x)
hice, pero supongo que todo lo que estaba haciendo era enumerar 4. ¿Eso es lo que estaba pasando? Gracias por la ayudai for i, x
en la lista de comprensión? Solo estoy acostumbrado a ver,i for i
por ejemplo, o un formato similar, ¿cuál es la función dex
? Graciasenumerate
devuelve un tuplas (ind, valor) durante el bucle, ahora podemos asignar los elementos de la tupla de dos variables utilizando:i, x = (ind, value)
. Esto es exactamente lo que está sucediendo en ese bucle.itertools.compress
solución, cambiexrange
arange
. (xrange
pasó a llamarserange
en Python 3.)Si tienes numpy disponible:
>>> import numpy as np >>> states = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False] >>> np.where(states)[0] array([4, 5, 7])
fuente
np.where(states)[0]
usar realmente los resultadosTL; DR : utilícelo
np.where
ya que es la opción más rápida. Las opciones sonnp.where
,itertools.compress
ylist comprehension
.Vea la comparación detallada a continuación, donde se puede ver que
np.where
supera a ambositertools.compress
y tambiénlist comprehension
.>>> from itertools import compress >>> import numpy as np >>> t = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False]` >>> t = 1000*t
list comprehension
>>> %timeit [i for i, x in enumerate(t) if x] 457 µs ± 1.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
itertools.compress
>>> %timeit list(compress(range(len(t)), t)) 210 µs ± 704 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
numpy.where
>>> %timeit np.where(t) 179 µs ± 593 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
fuente
Puede usar el filtro para ello:
filter(lambda x: self.states[x], range(len(self.states)))
El
range
aquí enumera los elementos de la lista y ya que queremos solamente aquellos en los queself.states
estáTrue
, estamos aplicando un filtro basado en esta condición.Para Python> 3.0:
list(filter(lambda x: self.states[x], range(len(self.states))))
fuente
Utilice la forma de comprensión del diccionario,
x = {k:v for k,v in enumerate(states) if v == True}
Entrada:
states = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False]
Salida:
{4: True, 5: True, 7: True}
fuente
Usando la multiplicación por elementos y un conjunto:
>>> states = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False] >>> set(multiply(states,range(1,len(states)+1))-1).difference({-1})
Salida:
{4, 5, 7}
fuente
Simplemente haz esto:
def which_index(self): return [ i for i in range(len(self.states)) if self.states[i] == True ]
fuente