【问题标题】:How to toggle between two values?如何在两个值之间切换?
【发布时间】:2022-03-11 01:02:33
【问题描述】:

我想在 Python 中的两个值之间切换,即 0 和 1 之间。

例如,当我第一次运行一个函数时,它产生数字 0。下一次,它产生 1。第三次它又回到零,依此类推。

对不起,如果这没有意义,但有人知道这样做的方法吗?

【问题讨论】:

    标签: python toggle


    【解决方案1】:

    使用itertools.cycle():

    from itertools import cycle
    myIterator = cycle(range(2))
    
    myIterator.next()   # or next(myIterator) which works in Python 3.x. Yields 0
    myIterator.next()   # or next(myIterator) which works in Python 3.x. Yields 1
    # etc.
    

    请注意,如果您需要比[0, 1] 更复杂的循环,则此解决方案将变得比此处发布的其他解决方案更具吸引力...

    from itertools import cycle
    mySmallSquareIterator = cycle(i*i for i in range(10))
    # Will yield 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 0, 1, 4, ...
    

    【讨论】:

    • 为什么不直接使用itertools.cycle(range(2))
    • 不,我的意思是myIterator = itertools.cycle(range(2)) 自己工作。你不需要 myFuncGenerator。
    • ...是的。我想我想说明一些其他概念。很快就会编辑。
    • 你应该展示一个更大的范围,或者一个'字符串',然后循环真的开始看起来不错..
    • 您应该在 Python 2.6 或更高版本中使用 next(x) 而不是 x.next() - 通过此更改,此答案中的代码也可以在 Python 3.x 中使用。
    【解决方案2】:

    您可以使用这样的生成器来完成此操作:

    >>> def alternate():
    ...   while True:
    ...     yield 0
    ...     yield 1
    ...
    >>>
    >>> alternator = alternate()
    >>>
    >>> alternator.next()
    0
    >>> alternator.next()
    1
    >>> alternator.next()
    0
    

    【讨论】:

    • 这比其他答案更普遍(不限于2个值,0和1,连续值......)。
    • itertools.cycle() 适用于任何可迭代的已知值。我看不出itertools 解决方案或这个解决方案如何在运行时拥有其生成器开关值,但我确信这样的事情并不难。
    • 这看起来正是我正在寻找的东西,将尝试一下。谢谢!
    • 在概念上更容易使用 True、False 和 next() 构建布尔切换器
    • 我就是喜欢 Python
    【解决方案3】:

    您可以使用 mod (%) 运算符。

    count = 0  # initialize count once
    

    然后

    count = (count + 1) % 2
    

    每次执行此语句时,都会在 0 和 1 之间切换 count 的值。这种方法的优势是您可以循环访问来自0 - (n-1) 的一系列值(如果需要),其中n 是您与% 运算符一起使用的值。而且这种技术不依赖于任何 Python 特定的功能/库。

    例如

    count = 0
    
    for i in range(5):
        count = (count + 1) % 2
        print(count)
    

    给予:

    1
    0
    1
    0
    1
    

    【讨论】:

    • xor 更高效且功能相同。
    • 没有理由同时拥有icount 变量。
    【解决方案4】:

    您可能会发现像这样创建函数别名很有用:

    import itertools
    myfunc = itertools.cycle([0,1]).next
    

    然后

    myfunc()    # -> returns 0
    myfunc()    # -> returns 1
    myfunc()    # -> returns 0
    myfunc()    # -> returns 1
    

    【讨论】:

    • +1 表示函数别名的想法。它就像生成器解决方案(在撰写本文时最流行),但无需写出函数定义!
    【解决方案5】:

    在 python 中,True 和 False 是整数(分别为 1 和 0)。您可以使用布尔值(True 或 False)和 not 运算符:

    var = not var
    

    当然,如果你想在 0 和 1 以外的数字之间进行迭代,这个技巧就变得有点困难了。

    将其打包成一个公认的丑陋函数:

    def alternate():
        alternate.x=not alternate.x
        return alternate.x
    
    alternate.x=True  #The first call to alternate will return False (0)
    
    mylist=[5,3]
    print(mylist[alternate()])  #5
    print(mylist[alternate()])  #3
    print(mylist[alternate()])  #5
    

    【讨论】:

    • 过于复杂...强烈建议查看itertools
    • @PlatinumAzure :Itertools 是一个更好的选择。 (事实上​​,我赞成你的解决方案)。以上只是为了演示一个在某些情况下可能有用的巧妙技巧——不建议将其打包成函数部分。 (函数可能不应该保存状态,这就是类的用途......)。但是 True 和 False 可用于将数组索引为 0 和 1 的事实很整洁(我认为)
    • 如果你真的想在一个函数中保存状态,你可以在其中使用alternate.x(而不是使用默认技巧)..我不得不承认我用过一两次. (但只有一两次。)
    【解决方案6】:
    from itertools import cycle
    
    alternator = cycle((0,1))
    next(alternator) # yields 0
    next(alternator) # yields 1
    next(alternator) # yields 0
    next(alternator) # yields 1
    #... forever
    

    【讨论】:

      【解决方案7】:
      var = 1
      var = 1 - var
      

      这是官方的棘手方法;)

      【讨论】:

      • 这将从 1 到 0 到 0 到 0 到... (-1)
      • @PlatinumAzure 不,不会。也许您将其阅读为var = var - 1?可能不是很pythonic,但比使用% 更好。它也适用于在任意两个数值之间切换。例如,var = 3 - var12 之间切换。
      • 正确...我一定是看错了。我也没有看到任何编辑历史表明答案已更改。我仍然不赞成,因为我认为它不直观/可维护。
      【解决方案8】:

      使用xor 有效,并且是在两个值之间切换的一种很好的视觉方式。

      count = 1
      count = count ^ 1 # count is now 0
      count = count ^ 1 # count is now 1
      

      【讨论】:

        【解决方案9】:

        要在两个任意(整数)值之间切换变量 x, 例如a 和 b,使用:

            # start with either x == a or x == b
            x = (a + b) - x
        
            # case x == a:
            # x = (a + b) - a  ==> x becomes b
        
            # case x == b:
            # x = (a + b) - b  ==> x becomes a
        

        例子:

        在 3 和 5 之间切换

            x = 3
            x = 8 - x  (now x == 5)
            x = 8 - x  (now x == 3)
            x = 8 - x  (now x == 5)
        

        这甚至适用于字符串(有点)。

            YesNo = 'YesNo'
            answer = 'Yes'
            answer = YesNo.replace(answer,'')  (now answer == 'No')
            answer = YesNo.replace(answer,'')  (now answer == 'Yes')
            answer = YesNo.replace(answer,'')  (now answer == 'No')
        

        【讨论】:

          【解决方案10】:

          使用元组下标技巧:

          value = (1, 0)[value]
          

          【讨论】:

          • 这是一个巧妙的技巧,但似乎使用它来在 0 和 1 以外的任何值之间交替会很快变得丑陋。
          • 是的。此技巧主要用作三元运算符的替代方法,但恰好适用于 OP 的特定情况。只是想我会加入一些不同的东西;)
          【解决方案11】:

          使用元组下标是在两个值之间切换的一种好方法:

          toggle_val = 1
          
          toggle_val = (1,0)[toggle_val]
          

          如果你在这个周围包裹一个函数,你会有一个很好的交替开关。

          【讨论】:

            【解决方案12】:

            如果之前定义了一个变量并且您希望它在两个值之间切换,您可以使用
            a if b else c 表单:

            variable = 'value1'
            variable = 'value2' if variable=='value1' else 'value1'
            

            此外,它适用于 Python 2.5+ 和 3.x

            请参阅 Python 3 文档中的 Expressions

            【讨论】:

              【解决方案13】:

              简单通用的解决方案,不使用任何内置。只需跟踪当前元素并打印/返回另一个元素,然后更改当前元素状态。

              a, b = map(int, raw_input("Enter both number: ").split())
              flag = input("Enter the first value: ")
              length = input("Enter Number of iterations: ")
              for i in range(length):
                  print flag
                  if flag == a:
                      flag = b;     
                  else:
                      flag = a
              

              输入:
              3 8
              3
              5
              输出:
              3
              8
              3
              8
              3

              Means numbers to be toggled are 3 and 8 Second input, is the first value by which you want to start the sequence And last input indicates the number of times you want to generate

              【讨论】:

                【解决方案14】:

                你可以用任何语言做一个很酷的方法:

                variable = 0
                variable = abs(variable - 1)    // 1
                variable = abs(variable - 1)    // 0
                
                

                【讨论】:

                • variable = 1 - variable 更酷 ;)
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-08-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多