早安, 我有一个numpy的阵列,如: [0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0]
发现阵列分离对数
,我想找到分离对1
三的数量(或更多)连续的1数也可作为对,即:在这个例子中,返回数量应为3
什么是实现这一目标的最好的技术?
非常感谢!
早安, 我有一个numpy的阵列,如: [0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0]
发现阵列分离对数
,我想找到分离对1
三的数量(或更多)连续的1数也可作为对,即:在这个例子中,返回数量应为3
什么是实现这一目标的最好的技术?
非常感谢!
您可以自己轻松地实现它,请参阅我下面的代码:
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)
我会去这样的事情:
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
小号一起。我想有些人会觉得它很丑,我认为它是可以的。
应该指出虽然,如果名单真的是很大,这是不是一个好的选择,因为它在内存中创建布尔变量的列表。这很容易避免。
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
使用itertools.groupby与和
的对应组迭代sum(1 for target, group_count in itertools.groupby(lst)
if target == 1 and len(list(group_count)) >= 2)