正在查看列表的示例(列表将始终排序)。列表大小为4 ^ 12。 [1,1,1,1,......,1,1,4]
此刻我有一个for循环,用一个计数器遍历列表,直到它找到第一个非1,然后断开并返回计数器。这比使用count函数更快,因为列表已经排序。我现在正在实施二进制搜索,我想知道是否有人能想出更好的方法来计算有序列表中的前导数量。
答案 0 :(得分:2)
您可以使用itertools.groupby
:
import itertools
s = [1,1,1,1,1,1,4]
runs = [len(list(b)) for a, b in itertools.groupby(s)][0]
输出:
6
答案 1 :(得分:2)
Bisect内置并且看起来比二进制排序快得多;
import bisect
import time
import itertools
test = [1] * 100000000
test[len(test) - 1] = 4
start = time.time()
print(bisect.bisect_right(test,1))
print(time.time() - start)
start = time.time()
runs = [len(list(b)) for a, b in itertools.groupby(test)][0]
print(runs)
print(time.time() - start)
start = time.time()
length= len(test)-test[::-1].index(1)
print(length)
print(time.time() - start)
# Bisect
99999999
3.719329833984375e-05
# GroupBy
99999999
1.2406058311462402
# Length
99999999
0.3920767307281494
答案 2 :(得分:0)
如果您只想查找第一个值的计数,那么您可以使用它:
a = [1,1,1,...,1,4]
first_value = a[0]
length= len(a)-a[::-1].index(first_value) #get index starting from the end