считать последовательные числа в списке питонов - PullRequest
2 голосов
/ 22 октября 2019

У меня есть список нулей и единиц, и я хочу знать, как часто 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 ]

3 голосов
/ 22 октября 2019

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]
2 голосов
/ 22 октября 2019

Небольшое отклонение от ответа @ 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...