J'ai un morceau de mon code où je suis censé créer un standard. Je souhaite renvoyer une liste de tous les commutateurs activés. Ici, "on" sera égal True
et "off" égal False
. Alors maintenant, je veux juste renvoyer une liste de toutes les True
valeurs et leur position. C'est tout ce que j'ai mais cela ne renvoie que la position de la première occurrence de True
(ce n'est qu'une partie de mon code):
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]
Cela ne renvoie que "4"
x
, puis faisaisenumerate(x)
mais je suppose que tout ce que je faisais était d'énumérer 4? C'est ce qui se passait? Merci pour l'aidei for i, x
la compréhension de la liste? Je n'ai l'habitude de voir quei for i
par exemple, ou un format similaire, quelle est la fonction dex
? Mercienumerate
retourne un tuples (ind, valeur) au cours de la boucle, nous pouvons maintenant affecter les éléments du tuple à deux variables à l' aide:i, x = (ind, value)
. C'est exactement ce qui se passe dans cette boucle.itertools.compress
solution, remplacez le fichierxrange
parrange
. (axrange
été renommérange
en Python 3.)Si vous avez 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])
la source
np.where(states)[0]
d'utiliser réellement les résultatsTL; DR : à utiliser
np.where
car c'est l'option la plus rapide. Vos options sontnp.where
,itertools.compress
etlist comprehension
.Voir la comparaison détaillée ci-dessous, où il peut être vu
np.where
surpasse à la foisitertools.compress
et aussilist 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)
la source
Vous pouvez utiliser un filtre pour cela:
filter(lambda x: self.states[x], range(len(self.states)))
L'
range
ici énumère les éléments de votre liste et comme nous ne voulons que ceux oùself.states
estTrue
, nous appliquons un filtre basé sur cette condition.Pour Python> 3.0:
list(filter(lambda x: self.states[x], range(len(self.states))))
la source
Utilisez la manière de comprendre le dictionnaire,
x = {k:v for k,v in enumerate(states) if v == True}
Contribution:
states = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False]
Production:
{4: True, 5: True, 7: True}
la source
En utilisant la multiplication par élément et un ensemble:
>>> 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})
Production:
{4, 5, 7}
la source
Faites simplement ceci:
def which_index(self): return [ i for i in range(len(self.states)) if self.states[i] == True ]
la source