<p>您可以让函数将函数作为参数,用作构建间隔的谓词:</p>
<pre><code>def indexscope(dlist, predicate):
scope = []
start = end = -1
for i, v in enumerate(dlist):
if predicate(v):
if start == -1:
start = end = i
continue
if end + 1 == i:
end = i
else:
scope.append([start] if start == end else [start, end])
start = end = i
if start != -1:
scope.append([start] if start == end else [start, end])
return scope
a = [12,11,5,7,2,21,32,13,6,42,1,8,9,0,32,38]
def less_than_10(n):
return n < 10
print(indexscope(a, less_than_10))
print(indexscope(a, lambda x: x > 20))
[[2, 4], [8], [10, 13]]
[[5, 6], [9], [14, 15]]
</code></pre>
<hr/>
<p><strong>使用scipy:</strong></p>
^{pr2}$
<hr/>
<p>结果将作为<code>slice</code>对象返回,但这对您非常有利,因为您可以使用它们来对抗原始np数组:</p>
<pre><code>small_a = [12,11,5,7,2,21,32,13,6,42,1,8,9,0,32,38]
small_np_array = np.array(small_a)
valid_ranges = passing_ranges(small_np_array, lambda n: n < 10)
for r in valid_ranges:
print(r[0], small_np_array[r])
slice(2, 5, None) [5 7 2]
slice(8, 9, None) [6]
slice(10, 14, None) [1 8 9 0]
</code></pre>
<hr/>
<p><strong>基准</strong></p>
^{4}$
<hr/>
<p>下面是您的答案,我甚至内联谓词以删除函数调用:</p>
<pre><code>from itertools import groupby, count
def xibinke(a):
l = [idx for idx,value in enumerate(a) if value<10]
return [list(g) for _,g in groupby(l,key=lambda n,c=count():n-next(c))]
%timeit xibinke(large_a)
1 loops, best of 3: 14.6 s per loop
</code></pre>