Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查值是否变为1并保持为1_Python - Fatal编程技术网

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