检查 value 是否变为 1 并保持为 1

sup*_*ain -2 python

例子:

(0, 0, 1, 1)    => True (becomes 1 and remains 1)
(0, 0, 0)       => False (never becomes 1)
(0, 1, 1, 0, 1) => False (becomes 1 but goes back to 0)
(1, 1, 1)       => True (ok to become 1 right away)
Run Code Online (Sandbox Code Playgroud)

我有一个有限生成器,它0为“未完成”和1“完成”提供信号值。它应该达到“完成”,然后保持“完成”。我想检查一下。

这是一个示例生成器(带有硬编码值)以及我想如何使用它:

def signal():
    yield from (0, 0, 1, 1)

>>> check(signal())
True
Run Code Online (Sandbox Code Playgroud)

我有一个解决方案,但它看起来又长又复杂。一定会有更好的办法!欢迎任何和所有想法。

def check(s):
    done = False
    for x in s:
        if x:
            done = True
            break
    if not done:
        return False
    for x in s:
        if not x:
            return False
    return True
Run Code Online (Sandbox Code Playgroud)

khe*_*ood 5

听起来你需要检查

  • 如果你曾经打过 1,并且
  • 如果你在击中 1击中了 0 。
def check(s):
    on = False
    for v in s:
        if on and not v:
            return False
        on = v
    return bool(on)
Run Code Online (Sandbox Code Playgroud)

或者,更算术地说,您希望序列单调递增,并且最后一个值是 1 而不是 0。

def check(s):
    last = 0
    for v in s:
        if v < last:
            return False
        last = v
    return bool(last)
Run Code Online (Sandbox Code Playgroud)

或者,如果您正在寻找一个聪明的解决方案而不是一个清晰的解决方案,只要您确定您的序列必须是一个生成器,您就可以利用短路并执行以下操作:

def check(s):
    return any(s) and all(s)
Run Code Online (Sandbox Code Playgroud)

any一旦找到 1(并停止消耗生成器)就all返回 true,如果所有后续元素都为 1 ,则返回 true。