计算python列表中的连续数字

时间:2019-10-22 20:14:08

标签: python list optimization

我有一个0和1的列表,我想知道0连续出现的频率。我写了一个快速而肮脏的解决方案。但是,我认为它很慢

例如

a = [0,0,0,1,1,1,0,0,0,1,1,0,0]
def duration(a):   
    b = "".join([str(x) for x in a])
    return [len(x) for x in b.split("1") if len(x)>0]
print(duration(a))

提供正确的输出([3,3,2])。我坚信,这样做的速度更快。

谢谢

glostas

2 个答案:

答案 0 :(得分:3)

itertools.groupby

from itertools import groupby

[len([*g]) for k, g in groupby(a) if k == 0]

[3, 3, 2]

Óscar López的答案中指出,使用语法list(g)与较早版本的python兼容。

[len(list(g)) for k, g in groupby(a) if k == 0]

for

result = []
count = 0
something_not_zero = 1
for e in [*a, something_not_zero]:
    if e == 0:
        count += 1
    elif count > 0:
        result.append(count)
        count = 0

result

[3, 3, 2]

答案 1 :(得分:2)

@piRSquared的答案略有不同(也使用itertools.groupby)。这也应在旧版本的Python中起作用:

from itertools import groupby

def duration(a):
    return [len(list(g)) for k, g in groupby(a) if k == 0]

例如:

duration([0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0])
=> [3, 3, 2]
相关问题