python - 检测和打印条纹
问题描述
我写了一些代码来检测数据中的条纹,只是想知道为什么它不起作用。
我有一个-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。
谢谢
解决方案
由于您知道您的代码有什么问题,我建议另一种直接的方法,在一次迭代中完成这项工作:
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]]
推荐阅读
- arrays - 如何有效地在 3D 点数组中找到共面点(地形)
- odoo - 在 _rec_name 中放入 Odoo 11 中两个字段的组合
- c# - 请求一个 jquery Post 以使用 Net Core 2.1 身份验证发出注销
- javascript - 不能多次调用 start()
- python - 根据许多约束选择项目
- javascript - 如何测试未定义的文档值 - React & Firestore
- html - 使没有行的 flex
- python - 提高 pandas 布尔索引的速度
- python - 无论维度如何,如何从张量中选择选定的行?
- angular - 在 ngOnInit 中无法读取未定义的属性“地图”