以0和0交换1,以Pythonic方式与1交换

Jua*_*nti 33 python

在我的Python程序的某些部分,我有一个val变量,可以是1或0.如果它是1,我必须更改为0,如果它是0,我必须更改为1.

你是如何以Pythonic的方式做到的?

if val == 1:
    val = 0
elif val == 0:
    val = 1
Run Code Online (Sandbox Code Playgroud)

它太长了!

我做了:

swap = {0: 1, 1:0}
Run Code Online (Sandbox Code Playgroud)

所以我可以用它:

swap[val]
Run Code Online (Sandbox Code Playgroud)

其他想法?

CB *_*ley 139

这不是pythonic,但它是语言中立的.通常val = 1 - val是最简单的.

  • 这很聪明,但它需要阅读代码的人思考(可能),这可能会迫使你添加评论.我更喜欢三元组.val = 0如果val else 1,因为它确切地说明了它的作用. (10认同)
  • `val = 1 - val`决不会传递`val`始终是'1`或'0`并且它应该*交换/翻转*这些值.`标记=未标记'同时传达. (4认同)
  • 另一种说法相同:var =((var + 1)&1). (2认同)
  • 我想我只会创建一个名为“bit_flip”的方法并使用此答案中的代码。一旦有了名字,就应该很容易了解它的作用。 (2认同)

YOU*_*YOU 24

True == 1False == 0在python中,

你可以使用 var = not var

它会交换它.

  • 在ethon中保证0评估为false,并且在布尔上下文中将1评估为true这一事实:http://docs.python.org/reference/expressions.html#boolean-operations (9认同)
  • 它是安全的(并且很好!)如果您使用`var`所做的只是算术(与"用正则表达式解析html无关",这只是愚蠢的! - ),但是如果你做过`str(var) `(包括一个内在的例如`print`),bool的行为不同(作为子类,它会覆盖`__str__`).问题中没有足够的信息来确保没有这样的字符串化,因此所选答案中的"1 - var"更安全. (4认同)
  • 但是`int(not 1) == 0` 和`int(not 0) == 1` 因为`int(True) == 1` 和`int(False) == 0`。这可能不是一个实现细节。 (2认同)

小智 17

最短的方法是使用按位运算符XOR.

如果您想val重新分配:

val ^= 1
Run Code Online (Sandbox Code Playgroud)

如果您不想val重新分配:

val ^ 1
Run Code Online (Sandbox Code Playgroud)


Geo*_*lly 10

另一种可能性:

i = (1,0)[i]
Run Code Online (Sandbox Code Playgroud)

只要我是肯定的,这很有效,正如dbr在评论中指出的那样,对于i <0,它不起作用.

你确定你不想使用FalseTrue吗?听起来几乎像它.


rpl*_*evy 6

在你的情况下,我推荐三元:

val = 0 if val else 1
Run Code Online (Sandbox Code Playgroud)

如果您有2个变量要交换,您可以说:

(a, b) = (b, a)
Run Code Online (Sandbox Code Playgroud)


小智 6

我已经交换了列表中的 0 和 1。

这是我的清单:

list1 = [1,0,0,1,0]

list1 = [i^1 for i in list1] 
#xor each element is the list

print(list1)
Run Code Online (Sandbox Code Playgroud)

所以结果是:[0,1,1,0,1]


Acu*_*nus 5

要扩展"YOU"答案,请使用:

int(not(val))
Run Code Online (Sandbox Code Playgroud)

例子:

>>> val = 0
>>> int(not(val))
1

>>> val = 1
>>> int(not(val))
0
Run Code Online (Sandbox Code Playgroud)

请注意,此答案仅是描述性的,而不是规定性的。