早上好,
我有一个像numpy数组:
[0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0]
我希望找到分开的1对的数量。
三个(或更多)连续1也计为对,即:在此示例中,返回的数字应为3.
实现这一目标的最佳技术是什么?
非常感谢!
答案 0 :(得分:1)
k
保存下面的基于唯一键0/1的列表,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
答案 1 :(得分: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)
答案 2 :(得分: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
和False
加在一起。我想有些人会发现它很难看,我觉得还可以。
应该注意的是,如果列表非常大,这不是一个好的选择,因为它会在内存中创建bool列表。很容易避免这种情况。
答案 3 :(得分:0)
使用itertools.groupby和sum
sum(1 for target, group_count in itertools.groupby(lst)
if target == 1 and len(list(group_count)) >= 2)