簡體   English   中英

count數組python中的事件數

[英]count number of events in an array python

我有以下數組:

a = [0,0,0,1,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0]

每次我有'1'或一系列(連續),這是一個事件。 我需要在Python中獲得我的數組有多少個事件。 因此,在這種情況下,我們將有5個事件(即5次1或其序列出現)。 我需要計算這樣的事件才能獲得:

b = [5]

謝謝

你可以使用itertools.groupby (它完全符合你想要的 - 對連續元素進行分組)並計算所有以1開頭的組:

In [1]: from itertools import groupby

In [2]: a = [0,0,0,1,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0]

In [3]: len([k for k, _ in groupby(a) if k == 1])
Out[3]: 5

如果我想添加一個事件的條件,只要中間有2個或更多'0',該怎么辦?

這可以使用groupby和自定義key功能完成:

from itertools import groupby


class GrouperFn:
    def __init__(self):
        self.prev = None

    def __call__(self, n):
        assert n is not None, 'n must not be None'

        if self.prev is None:
            self.prev = n
            return n

        if self.prev == 1:
            self.prev = n
            return 1

        self.prev = n
        return n


def count_events(events):
    return len([k for k, _ in groupby(events, GrouperFn()) if k == 1])


def run_tests(tests):
    for e, a in tests:
        c = count_events(e)
        assert c == a, 'failed for {}, expected {}, given {}'.format(e, a, c)

    print('All tests passed')


def main():
    run_tests([
        ([0, 1, 1, 1, 0], 1),
        ([], 0),
        ([1], 1),
        ([0], 0),
        ([0, 0, 0], 0),
        ([1, 1, 0, 1, 1], 1),
        ([0, 1, 1, 0, 1, 1, 0], 1),
        ([1, 0, 1, 1, 0, 1, 1, 0, 0, 1], 2),
        ([1, 1, 0, 0, 1, 1], 2),
        ([0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0], 4)
    ])


if __name__ == "__main__":
    main()

這個想法非常簡單 - 當0在一組1之后,它可能是該組的一部分,因此應該包含在該組中。 下一個事件要么繼續該組(如果事件為1 ),要么將其拆分(如果事件為0

注意,所提出的方法僅在您需要計算多個事件時才有效,因為它將[1, 1, 0, 0] 1,1,0,0]分割為[[1, 1, 0], [0]]

數學方式(小心空數組):

a = [0,0,0,1,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0]
events = (a[0] + a[-1] + sum(a[i] != a[i-1] for i in range(1, len(a)))) / 2
print events

我覺得這很有效:)

def num_events(list):
    total = 0
    in_event = 0
    for current in list:
        if current and not in_event:
            total += 1
        in_event = current
    return total

此函數從左側迭代列表,每次在0之后立即遇到1時,它會遞增計數器。 換句話說,它在每個事件開始時將總計數加1。

嘗試這個

a = [0,0,0,1,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0]

flag = 0
cnt = 0
for j in (a):
    if( j == 1):
        if(flag == 0):
            cnt += 1
        flag = 1
    elif (j == 0):
        flag = 0


print cnt                   

多一個:

sum([(a[i] - a[i-1])>0 for i in range(1, len(a))])

我是個傻瓜;-)

def get_number_of_events(event_list):
    num_of_events = 0
    for index, value in enumerate(event_list):
        if 0 in (value, index):
            continue
        elif event_list[index-1] == 0:
            num_of_events += 1
    return num_of_events

要用單次出現替換多次出現,如果只有最后一個附加項不等於當前項,則將每個項追加到列表中,並進行計數。

def count_series(seq):
    seq = iter(seq)
    result = [next(seq, None)]
    for item in seq:
        if result[-1] != item:
            result.append(item)
    return result

a = [0,0,0,1,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0]

count_series(a).count(1)
5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM