Saya memiliki bagian dari kode saya di mana saya seharusnya membuat switchboard. Saya ingin mengembalikan daftar semua sakelar yang aktif. Di sini "on" akan sama True
dan "off" sama False
. Jadi sekarang saya hanya ingin mengembalikan daftar semua True
nilai dan posisinya. Ini semua yang saya miliki tetapi hanya mengembalikan posisi kejadian pertama True
(ini hanya sebagian dari kode saya):
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]
Ini hanya mengembalikan "4"
x
, lalu melakukanenumerate(x)
tetapi saya kira yang saya lakukan hanyalah menghitung 4? Itukah yang terjadi? Terima kasih atas bantuannyai for i, x
pemahaman daftar? Saya hanya terbiasa melihati for i
misalnya, atau format serupa, apa fungsinyax
? Terima kasihenumerate
mengembalikan tupel (ind, nilai) selama loop, sekarang kita dapat menetapkan item dari tuple untuk dua variabel menggunakan:i, x = (ind, value)
. Inilah tepatnya yang terjadi dalam lingkaran itu.itertools.compress
solusinya, ubahxrange
menjadirange
. (xrange
diubah namanya menjadirange
di Python 3.)Jika Anda memiliki numpy tersedia:
>>> 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])
sumber
np.where(states)[0]
untuk benar-benar menggunakan hasilTL; DR : gunakan
np.where
karena ini adalah opsi tercepat. Pilihan Anda adalahnp.where
,itertools.compress
, danlist comprehension
.Lihat perbandingan mendetail di bawah ini, di mana ia dapat dilihat
np.where
mengungguli keduanyaitertools.compress
dan jugalist 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)
sumber
Anda dapat menggunakan filter untuk itu:
filter(lambda x: self.states[x], range(len(self.states)))
Di
range
sini menyebutkan elemen dari daftar Anda dan karena kami hanya menginginkan yangself.states
adaTrue
, kami menerapkan filter berdasarkan kondisi ini.Untuk Python> 3.0:
list(filter(lambda x: self.states[x], range(len(self.states))))
sumber
Gunakan cara pemahaman kamus,
x = {k:v for k,v in enumerate(states) if v == True}
Memasukkan:
states = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False]
Keluaran:
{4: True, 5: True, 7: True}
sumber
Menggunakan perkalian bijak dan satu set:
>>> 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})
Keluaran:
{4, 5, 7}
sumber
Cukup lakukan ini:
def which_index(self): return [ i for i in range(len(self.states)) if self.states[i] == True ]
sumber