此问题与此处Number of consecutive values above certain cut off链接的上一个问题有关,与@kvantour所提供的答案略相关
因此,就我而言,我有这样的文件(样本输入)
UIButton.reactive.pressed
首先:在我的情况下,如果2个或多个连续值满足给定的截止值c = 0.33,我将其称为B。这由条件m给出,请参见:Number of consecutive values above certain cut off
第二:如果c为0.33,并且我想要小于c的值,它将打印出0.32和0.323,但我也想打印出0.35,因为这只是c之上的一种情况,不符合我的规则m中提到的内容,因此也将被打印出来。 @kvantour回答了这个问题。我叫这个F
所以在我的$ 2中,状态看起来像这样 0.34
0.3432
0.32
0.35
0.323
0.3623
0.345
0.32
0.31
0.378
0.34
0.35
0.342
因此,我可以计算发生故障( B )的事件的数量,例如以下(样本输出)
BCBCB
有没有一种方法可以计数并打印出编号。破碎事件列表?
答案 0 :(得分:2)
awk
(与朋友们一起营救)
$ awk 'NR>1{print ($2>0.33)}' file | uniq -c | awk '$2 && $1>1{print $1}'
2
2
4
说明
NR>1{print ($2>0.33)}
打印1或0是否满足条件$2>0.33
,跳过第一行标题行。
uniq -c
计算连续的重复值(链长)
$2 && $1>1{print $1}
在值非零(此处为1)且长度大于OP指定的长度时打印链长。
答案 1 :(得分:0)
确定连续损坏多少帧。如果只有一帧坏了(但上一帧和下一帧都很好),那没关系,请忽略它。如果一帧的值大于临界值(0.33),则该帧将被破坏。
rm -rf <Directory_Name>
读入输入
from itertools import groupby
我要根据空格分割每一行,而忽略帧号
def get_input():
with open('input.txt') as f:
next(f) # skip the first line
input_list = []
这是一个辅助函数,如果该值大于临界值,则仅返回True或False
for line in f:
input_list.append(float(line.split()[1]))
return input_list
这是有趣的部分。我们根据值是高于还是低于标准对值进行分组。我们回到小组,可以检查其中有多少人。
在下面的def above_cutoff(x, cutoff):
return x > cutoff
循环中,如果组在截止点以上,则变量for
将为above
。 True
是包含该组的生成器。我只是将其转换为列表,因为它更易于使用并检查其长度。
g
如果该组长于1,则符合您的条件,因此请添加其长度
def count_broken(input_list, cutoff):
# returns list with number of values in a row above threshold
state = []
for above, g in groupby(input_list, lambda x: above_cutoff(x, cutoff)):
group = list(g)
print(above, group, len(group))
循环中的打印语句输出以下内容:
if above and len(group) > 1:
state.append(len(group))
return state
input_list = get_input()
print(*count_broken(input_list, 0.33), sep='\n')
最终结果是:
True [0.34, 0.3432] 2
False [0.32] 1
True [0.35] 1 # while this group is True/in state B/broken, ignore it cause it is just 1 frame.
False [0.323] 1
True [0.3623, 0.345] 2
False [0.32, 0.31] 2
True [0.378, 0.34, 0.35, 0.342] 4
我的解决方案基于以下问题的可接受答案:Take in a list, return a list of True/False based on consecutive duplicate values