2014-01-30 37 views
31

我有一段代碼,我應該創建一個總機。我想返回所有打開的開關的列表。這裏的「on」將等於True,「off」等於False。所以現在我只想返回所有True值及其位置的列表。這是我的全部,但它只有返回True中第一次出現的位置(這只是我的代碼部分):「4」在布爾列表中獲取真值的索引

回答

45

使用enumeratelist.index回報

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] 

這隻回報找到第一個匹配的索引。

>>> t = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False] 
>>> [i for i, x in enumerate(t) if x] 
[4, 5, 7] 

對於龐大的列表,它會更好地使用itertools.compress

>>> from itertools import compress 
>>> list(compress(xrange(len(t)), t)) 
[4, 5, 7] 
>>> t = t*1000 
>>> %timeit [i for i, x in enumerate(t) if x] 
100 loops, best of 3: 2.55 ms per loop 
>>> %timeit list(compress(xrange(len(t)), t)) 
1000 loops, best of 3: 696 µs per loop 
+0

啊,我看到了,我看到一些類似的問題,告訴我使用枚舉,但我想我錯了。我將列表設置爲'x',然後執行'enumerate(x)',但我想我所做的只是枚舉4?那是怎麼回事?感謝您的幫助 – Amon

+0

當您在列表理解中爲i,x做'i'時會發生什麼?例如,我只習慣看「我爲我」或類似的格式,「x」的功能是什麼?謝謝 – Amon

+1

@Amon'enumerate'在循環期間返回一個元組(ind,value),現在我們可以使用:'i,x =(ind,value)'將元組的項賦給兩個變量。這正是這個循環中發生的事情。 –

2

您可以使用過濾器是:

filter(lambda x: self.states[x], range(len(self.states))) 

range這裏列舉列表的元素因爲我們只需要那些self.statesTrue的人,我們正在應用基於此條件的過濾器。

0

使用字典理解的方式,

x = {k:v for k,v in enumerate(states) if v == True} 

輸入:

states = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False] 

輸出:

{4: True, 5: True, 7: True} 
+2

這是一個字典理解而不是列表理解。 –

22

如果您有可用numpy的:

>>> 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]) 
+4

請注意,這返回一個元組,它需要'np.where(states)[0]'實際使用結果 – Woofas