首页 > 解决方案 > 检测和打印条纹

问题描述

我写了一些代码来检测数据中的条纹,只是想知道为什么它不起作用。

我有一个-1、0和1的序列。我想报告非零值的位置。但它们往往是连续出现的;因此,我想报告条纹,而不仅仅是报告单个位置。这是一个简单的例子:

sequence=[-1,-1,0,0,1,1]

print('Negative Influences:')
streaking=False
streak=[]
for j in range(len(sequence)):
    if streaking==False and sequence[j]==-1:
        streaking==True
        streak.append(j)
    elif streaking==True and sequence[j]==-1:
        streak.append(j)
    elif streaking==True and sequence[j]!=-1:
        streaking==False
        print(streak)
        streak=[]

print('Positive Influences:')
streaking=False
streak=[]
for j in range(len(sequence)):
    if streaking==False and sequence[j]==1:
        streaking==True
        streak.append(j)
    elif streaking==True and sequence[j]==1:
        streak.append(j)
    elif streaking==True and sequence[j]!=1:
        streaking==False
        print(streak)
        streak=[]

我期望以下输出:

Negative Influences: [0,1]
Positive Influences: [4,5]

不幸的是,我得到了空白:

Negative Influences:
Positive Influences:

为了调试,我尝试在每次迭代结束时添加一个 print(streaking) 命令。它揭示了裸奔总是错误的。这是为什么?当它击中第一个 -1(或分别为 1)时,streaking 应该变为 True。

谢谢

标签: python

解决方案


由于您知道您的代码有什么问题,我建议另一种直接的方法,在一次迭代中完成这项工作:

from itertools import groupby

sequence = [-1,0,-1,-1,-1,-1,-1,-1,-1,-1,0,0,1,1,1,1]

pos, neg = [], []
cnt = 0

for k, g in groupby(sequence):
    g = list(g)
    if k == -1 and len(g) == 1:
        neg.append(cnt)
    elif k == -1 and len(g) > 1:
        neg.append([cnt, cnt + len(g) - 1])
    elif k == 1 and len(g) == 1:
        pos.append(cnt)
    elif k == 1 and len(g) > 1:
        pos.append([cnt, cnt + len(g) - 1])
    cnt += len(g)

print(neg)  # [0, [2, 9]]
print(pos)  # [[12, 15]]

推荐阅读