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 Truey "off" igual False. Así que ahora solo quiero devolver una lista de todos los Truevalores 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, xen la lista de comprensión? Solo estoy acostumbrado a ver,i for ipor ejemplo, o un formato similar, ¿cuál es la función dex? Graciasenumeratedevuelve 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.compresssolución, cambiexrangearange. (xrangepasó a llamarserangeen 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.whereya que es la opción más rápida. Las opciones sonnp.where,itertools.compressylist comprehension.Vea la comparación detallada a continuación, donde se puede ver que
np.wheresupera a ambositertools.compressy 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*tlist 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
rangeaquí enumera los elementos de la lista y ya que queremos solamente aquellos en los queself.statesestá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