以阈值执行操作的Python方式

2024-07-01 08:31:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我相信有一个简单的方法可以做到这一点,但也许我忽略了一些东西

假设我的阈值为2。我想在值超过2时立即执行操作

如果后续值也大于或等于2,则我不想执行该操作

我唯一能弄清楚如何做到这一点的方法是将其与之前的值进行比较,我认为它是clugy而不是pythonic

所以:我有一个系列:

series = [1.99, 1.88, 2.21, 2.32, 2.42, ....]

所以在series[2]我想做点什么,因为我已经超过了2.0的阈值。但之后我不想做同样的事情。超过2.0会触发操作,但不会重复后续值大于2.0的操作

我能想到的唯一方法是与前面的值进行比较:

因此:

for i in range(length(series):

    if series[i] > 2.0 and series[i-1] <= 2.0:

        do something

这会起作用,但似乎是糟糕的编程

有没有更像Python的方法

请指导


Tags: and方法inforif编程range阈值
2条回答

根据评论,这里有一个可能的解决方案^{}

from itertools import groupby

series = [1.99, 1.88, 2.21, 2.32, 2.42, 1.0, 2.1]

def action(value):
    print('Action trigerred at value {}'.format(value))

for condition, g in groupby(series, lambda k: k > 2.0):
    if condition:
        action(next(g))

印刷品:

Action trigerred at value 2.21
Action trigerred at value 2.1

您可以使用一个状态指示器来了解您在之前低于阈值之后现在是否已经高于阈值。这将允许您在不使用索引(不是很Pythonic)的情况下继续操作:

series    = [1,1,3,3,1,5,1,8,3,4,1]
threshold = 2.0
below     = True
for value in series:
    nowAbove = value > threshold
    if below and nowAbove:
        # do something
        print(value)
    below = not nowAbove

# 3
# 5
# 8

如果你经常做这样的循环,你可能想考虑创建一个特殊的迭代器,它只返回应该触发动作的值(即在阈值触发中断):

def breaks(iterable,condition,state=False):
    for value in iterable:
        if condition(value) == state: continue
        state = not state
        if state: yield value

series    = [1,1,3,3,1,5,1,8,3,4,1]
threshold = lambda v: v > 2.0
for value in breaks(series,threshold):
    # do something (only values to process will be returned)
    print(value)

函数breaks()的状态参数允许您决定序列中的第一个条目是否被视为中断(例如,当从上一个序列的最后一个状态继续时)

相关问题 更多 >

    热门问题