我想查找列表中第n個項目發生的索引。例如,查找列表中第n個項目的索引
x=[False,True,True,False,True,False,True,False,False,False,True,False,True]
第n個真值的指數是多少?如果我想第五發生(第4,如果零索引),答案是10
我想出:
indargs = [ i for i,a in enumerate(x) if a ]
indargs[n]
注意x.index
返回第一次出現或經過一番首次出現點,因此,據我所知,不是一個解決方案。
對於類似於上述情況的情況,在numpy中也存在解決方案,例如,使用cumsum
和where
,但我想知道是否有一個numpy自由的方式來解決這個問題。
自從我第一次遇到這個問題時,我擔心性能問題,同時實施了Eratosthenes篩選問題Project Euler問題,但這是我在其他情況下遇到的一個更普遍的問題。
編輯:我得到了很多很好的答案,所以我決定做一些性能測試。以下是timeit
執行時間,以len
元素搜索第4000/1000個真的列表的秒數執行。這些列表是隨機的真/假。下面鏈接的源代碼;這是一個混亂。我使用海報名稱的短/修改版本來描述listcomp
之外的功能,這是上面簡單的列表理解。
True Test (100'th True in a list containing True/False)
nelements eyquem_occur eyquem_occurrence graddy taymon listcomp hettinger26 hettinger
3000: 0.007824 0.031117 0.002144 0.007694 0.026908 0.003563 0.003563
10000: 0.018424 0.103049 0.002233 0.018063 0.088245 0.003610 0.003769
50000: 0.078383 0.515265 0.002140 0.078074 0.442630 0.003719 0.003608
100000: 0.152804 1.054196 0.002129 0.152691 0.903827 0.003741 0.003769
200000: 0.303084 2.123534 0.002212 0.301918 1.837870 0.003522 0.003601
True Test (1000'th True in a list containing True/False)
nelements eyquem_occur eyquem_occurrence graddy taymon listcomp hettinger26 hettinger
3000: 0.038461 0.031358 0.024167 0.039277 0.026640 0.035283 0.034482
10000: 0.049063 0.103241 0.024120 0.049383 0.088688 0.035515 0.034700
50000: 0.108860 0.516037 0.023956 0.109546 0.442078 0.035269 0.035373
100000: 0.183568 1.049817 0.024228 0.184406 0.906709 0.035135 0.036027
200000: 0.333501 2.141629 0.024239 0.333908 1.826397 0.034879 0.036551
True Test (20000'th True in a list containing True/False)
nelements eyquem_occur eyquem_occurrence graddy taymon listcomp hettinger26 hettinger
3000: 0.004520 0.004439 0.036853 0.004458 0.026900 0.053460 0.053734
10000: 0.014925 0.014715 0.126084 0.014864 0.088470 0.177792 0.177716
50000: 0.766154 0.515107 0.499068 0.781289 0.443654 0.707134 0.711072
100000: 0.837363 1.051426 0.501842 0.862350 0.903189 0.707552 0.706808
200000: 0.991740 2.124445 0.498408 1.008187 1.839797 0.715844 0.709063
Number Test (750'th 0 in a list containing 0-9)
nelements eyquem_occur eyquem_occurrence graddy taymon listcomp hettinger26 hettinger
3000: 0.026996 0.026887 0.015494 0.030343 0.022417 0.026557 0.026236
10000: 0.037887 0.089267 0.015839 0.040519 0.074941 0.026525 0.027057
50000: 0.097777 0.445236 0.015396 0.101242 0.371496 0.025945 0.026156
100000: 0.173794 0.905993 0.015409 0.176317 0.762155 0.026215 0.026871
200000: 0.324930 1.847375 0.015506 0.327957 1.536012 0.027390 0.026657
Hettinger的itertools解決方案几乎總是最好的。 taymon's和graddy的解決方案在大多數情況下是次佳的,但是當你想要第n個實例使得n很高或列表中出現少於n個事件時,列表理解方法對於短陣列可能更好。如果有可能出現少於n次的情況,則最初的count
檢查可節省時間。另外,當搜索數字而不是True/False時,graddy的效率更高......不清楚原因是什麼。 eyquem的解決方案基本上等同於其他開銷略微增加或減少的其他解決方案; eyquem_occur與taymon的解決方案大致相同,而eyquem_occurrence與listcomp相似。
編輯:我以前的評論假設你問的是不同的問題,而不是語法。抱歉。我不是Python傢伙,但它似乎應該能夠計算出無論你想用for循環發生多少次事件,每次都增加計數器。在一個while循環中加以解析。因此,雖然(amountOfTrues
varatis
+ 1爲傑出的答覆比較答案。做得好! –