Python 检查值是否变为1并保持为1
示例:Python 检查值是否变为1并保持为1,python,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) 我有一个有限的生成器,它为我提供信号值,0表示“未完成”,而1表
(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)
我有一个有限的生成器,它为我提供信号值,0表示“未完成”,而1表示“完成”。它应该达到“完成”,然后保持“完成”。我想核实一下
下面是一个示例生成器(带有硬编码值)以及我希望如何使用它:
def signal():
yield from (0, 0, 1, 1)
>>> check(signal())
True
我有一个解决办法,但它似乎又长又复杂。一定有更好的办法!欢迎提出任何意见
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
听起来你需要检查一下
- 如果你打过1,然后
- 如果你在打了1之后再打0
或者,从算术角度来说,你希望你的序列是单调递增的,最后一个值是1而不是0
def check(s):
last = 0
for v in s:
if v < last:
return False
last = v
return bool(last)
any
在找到1后立即返回true(并停止使用生成器),而all
在所有后续元素都为1时返回true。一种方法是将迭代器与函数一起使用:
def检查:
i=国际热核实验堆
对于i中的v:
如果v:
全部归还(一)
返回错误
首先,我们在输入iterable上创建一个迭代器
然后,如果所有值均为0
,则循环将耗尽并返回False
一旦满足1
,这将返回是否所有后续元素都是1
。因为我们转换为迭代器,all
函数将只查看第一个1
之后的元素
- 如果你知道你的输入总是迭代器,你可以去掉第一行(
i=iter(s)
),用s
替换i
您可以使用
from itertools import dropwhile
def check(s):
rest = dropwhile(lambda x: not x, s)
try:
first = next(rest)
return True if all(x for x in (first, *rest)) else False
except StopIteration:
return False
与
我们需要使用try/except
块,因为
if all(x for x in [])
返回True
,因此我们需要确保生成器没有空,并带有next(…)
我想您正在寻找:
def check(generator):
return 1 in generator and 0 not in generator
这得益于短路评估,因为发电机中的1
消耗发电机中的所有元件,直到达到1
,并且0不在发电机中
断言剩余元件中没有以下零
编辑-刚刚看到了khelwood的答案,这是等效的。def已排序(l):返回全部(l[i]@erip在生成器上不起作用。@erip加上如果它是一个列表,你会得到我的第二个示例错误([0,0,0,0]
)。我测试了你的check函数,但得到了这个结果。(0,0,1,1)=>False(0,0,0)=>False(1,1,1)=>TrueThis总是返回True
。是时候承认这是一个围绕一个漂亮的解决方案的有趣的小谜题了。你很接近了。(问题中有一个提示,但我认为你不需要它。)最后一个是目标,正如问题的最后一句所暗示的。(正如其他地方所评论的,这是一个有趣的小谜题,希望没有人介意:-)是的,这是一个很好的选择,一个变体是我发现的最短的:return(1in s)>(0in s)
(如果要对高尔夫进行编码)
from itertools import dropwhile
def check(s):
rest = dropwhile(lambda x: not x, s)
try:
first = next(rest)
return True if all(x for x in (first, *rest)) else False
except StopIteration:
return False
assert check((0, 0, 1, 1)) == True
assert check((0, 0, 0)) == False
assert check((0, 1, 1, 0, 1)) == False
assert check((1, 1, 1)) == True
if all(x for x in [])
def check(generator):
return 1 in generator and 0 not in generator