例子:
(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)
听起来你需要检查
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。
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |