39

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

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

抱歉,如果这没有意义,但有人知道这样做的方法吗?

4

14 回答 14

61

使用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, ...
于 2012-06-11T20:23:03.033 回答
48

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

>>> def alternate():
...   while True:
...     yield 0
...     yield 1
...
>>>
>>> alternator = alternate()
>>>
>>> alternator.next()
0
>>> alternator.next()
1
>>> alternator.next()
0
于 2012-06-11T20:21:18.230 回答
20

您可以使用 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
于 2012-06-11T20:19:37.783 回答
18

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

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

然后

myfunc()    # -> returns 0
myfunc()    # -> returns 1
myfunc()    # -> returns 0
myfunc()    # -> returns 1
于 2012-06-11T20:36:58.610 回答
9

在 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
于 2012-06-11T20:24:23.083 回答
8
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
于 2012-06-11T20:29:59.330 回答
7
var = 1
var = 1 - var

这是官方的棘手方法;)

于 2012-06-11T20:21:20.887 回答
6

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

count = 1
count = count ^ 1 # count is now 0
count = count ^ 1 # count is now 1
于 2012-06-11T20:22:37.173 回答
6

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

    # 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')
于 2018-06-07T22:09:28.150 回答
4

使用元组下标技巧:

value = (1, 0)[value]
于 2012-06-11T20:21:45.577 回答
2

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

toggle_val = 1

toggle_val = (1,0)[toggle_val]

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

于 2012-06-12T10:58:29.600 回答
1

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

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

于 2015-08-23T08:43:17.420 回答
1

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

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

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

https://docs.python.org/3/reference/expressions.html#conditional-expressions

于 2018-05-03T17:12:46.500 回答
-1

您可以使用任何语言进行的一种很酷的方式:

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

于 2019-12-05T04:18:27.423 回答