我有一个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
答案 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]