2016-12-04 45 views
1

早安, 我有一个numpy的阵列,如: [0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0]发现阵列分离对数

,我想找到分离对1

三的数量(或更多)连续的1数也可作为对,即:在这个例子中,返回数量应为3

什么是实现这一目标的最好的技术?

非常感谢!

回答

0

您可以自己轻松地实现它,请参阅我下面的代码:

l = [0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0] 
# Create flag to skip all elements that have >2 1 in sequence 
added = False 
pairs_counter = 0 
for i in range(1, len(l)): 
    rem = l[i - 1] 
    if l[i] == 1 and rem == 1 and not added: 
     added = True 
     pairs_counter +=1 
    if l[i] == 0: 
     added = False 
print (pairs_counter) 

这种方法的复杂性是O(n)

0

我会去这样的事情:

a = [0 1 1 0 1 1 1 0 0 1 0 1 1 0] 
sum([ 
    a[i-2] == a[i-1] == 1 and a[i] == 0 
    for i in xrange(2,len(a)) 
]) + (len(a) > 2 and a[-1] == a[-2] == 1) 

它只是不断增加True S和False小号一起。我想有些人会觉得它很丑,我认为它是可以的。

应该指出虽然,如果名单真的是很大,这是不是一个好的选择,因为它在内存中创建布尔变量的列表。这很容易避免。

1

使用itertools.groupby

k持有下面的唯一密钥0/1基于列表LST,g持有的唯一键k

import itertools 
target = 1 
lst = [0,1,1,0,1,1,1,0,0,1,0,1,1,0] 
pair_count = 0 

for k,g in itertools.groupby(lst): 
    if k==target and len(list(g))>1: # match target and more than 1 count as pair 
     pair_count += 1 
# pair_count = 3 
0

使用itertools.groupby与和

的对应组迭代
sum(1 for target, group_count in itertools.groupby(lst) 
    if target == 1 and len(list(group_count)) >= 2)