Ich habe einen Teil meines Codes, in dem ich eine Telefonzentrale erstellen soll. Ich möchte eine Liste aller eingeschalteten Schalter zurückgeben. Hier ist "Ein" gleich True
und "Aus" gleich False
. Jetzt möchte ich nur eine Liste aller True
Werte und ihrer Position zurückgeben. Dies ist alles, was ich habe, aber es gibt nur die Position des ersten Auftretens von zurück True
(dies ist nur ein Teil meines Codes):
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]
Dies gibt nur "4" zurück.
x
und dann getan,enumerate(x)
aber ich denke, alles, was ich getan habe, war 4 aufzuzählen? Ist es das, was passiert ist? Vielen Dank für die Hilfei for i, x
im Listenverständnis tun ? Ich bin es nur gewohnt,i for i
zum Beispiel oder ein ähnliches Format zu sehen, wovon funktioniert esx
? Dankeenumerate
gibt während der Schleife ein Tupel (ind, value) zurück. Jetzt können wir die Elemente des Tupels zwei Variablen zuweisen, indem wir :i, x = (ind, value)
. Genau das passiert in dieser Schleife.itertools.compress
Lösung dasxrange
inrange
. (xrange
wurderange
in Python 3 umbenannt)Wenn Sie numpy zur Verfügung haben:
>>> 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])
quelle
np.where(states)[0]
die Ergebnisse tatsächlich verwenden mussTL; DR : Verwenden Sie,
np.where
da dies die schnellste Option ist. Ihre Optionen sindnp.where
,itertools.compress
undlist comprehension
.Siehe den Vergleich unten, wo es gesehen werden kann ,
np.where
übertrifft sowohlitertools.compress
als auchlist 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)
quelle
Sie können Filter dafür verwenden:
filter(lambda x: self.states[x], range(len(self.states)))
Das
range
hier listet Elemente Ihrer Liste auf und da wir nur diejenigen wollen, wo esself.states
istTrue
, wenden wir einen Filter an, der auf dieser Bedingung basiert.Für Python> 3.0:
list(filter(lambda x: self.states[x], range(len(self.states))))
quelle
Verwenden Sie Wörterbuch Verständnis Weg,
x = {k:v for k,v in enumerate(states) if v == True}
Eingang:
states = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False]
Ausgabe:
{4: True, 5: True, 7: True}
quelle
Verwenden der elementweisen Multiplikation und einer Menge:
>>> 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})
Ausgabe:
{4, 5, 7}
quelle
Mach das einfach:
def which_index(self): return [ i for i in range(len(self.states)) if self.states[i] == True ]
quelle