[英]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.