计算列表中重复前导整数数量的最快方法

时间:2018-02-02 15:52:24

标签: python

正在查看列表的示例(列表将始终排序)。列表大小为4 ^ 12。 [1,1,1,1,......,1,1,4]

此刻我有一个for循环,用一个计数器遍历列表,直到它找到第一个非1,然后断开并返回计数器。这比使用count函数更快,因为列表已经排序。我现在正在实施二进制搜索,我想知道是否有人能想出更好的方法来计算有序列表中的前导数量。

3 个答案:

答案 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