2015-09-30 2 views
3

Как можно сделать следующее более компактным (возможно, с помощью булевых), учитывая, что я снабжен целочисленной переменной?Что было бы компактным способом возврата 1, если переменная равна 0 и для возврата 0, если она равна 1?

indexTag = 0 # or 1 
1 if indexTag == 0 else 0 
+1

Я не знаю, если поставить в качестве ответа, но '[1,0] [indexTag]' работает хорошо –

+1

Это имеет то преимущество, (или demerit) повышения исключения IndexError, если какое-либо недопустимое целое когда-либо пытается свернуть сторону. – nigel222

+0

Не могли бы вы дать еще какой-нибудь контекст? Что вы на самом деле делаете * с результатом? – jonrsharpe

ответ

7

Вы можете использовать not:

not indexTag 

, который дает вам логическое (True или False), но Python булевы являются подклассом int и есть целое значение (False является 0 , True - 1). Вы можете превратить это обратно в целое число с int(not indexTag), но если это просто логическое значение, зачем беспокоиться?

Или вы можете отнять от 1; 1 - 0 является 1 и 1 - 1 является 0:

1 - indexTag 

или вы могли бы использовать условное выражение:

0 if indexTag else 1 

Демо:

>>> for indexTag in (0, 1): 
...  print 'indexTag:', indexTag 
...  print 'boolean not:', not indexTag 
...  print 'subtraction:', 1 - indexTag 
...  print 'conditional expression:', 0 if indexTag else 1 
...  print 
... 
indexTag: 0 
boolean not: True 
subtraction: 1 
conditional expression: 1 

indexTag: 1 
boolean not: False 
subtraction: 0 
conditional expression: 0 
+0

Явный лучше, чем неявный, так что заклинание это? Или 'not bool (indexTag)' или 'int (not bool (indexTag))'. Думаю, я предпочитаю условное выражение. – nigel222

+0

Спасибо за ваше четкое и подробное предложение. Ключевым битом информации является тот факт, что логические значения Python могут быть преобразованы непосредственно в целые представления. – d3pd

4

Или вы можете использовать ^ (XOR) и просто :

indexTag = 1^indexTag 

Этим достигается то, что вы хотите, потому что .. это то, что делает XOR:

+---------------+ 
| Input | Output| 
+---+---+-------+ 
| A | B |  | 
+---+---+  | 
| 0 | 0 | 0 | 
| 0 | 1 | 1 | < 
| 1 | 0 | 1 | 
| 1 | 1 | 0 | < 
+---+---+-------+ 
+0

Правда, до тех пор, пока ваш indexTag действительно ограничен 1 или 0. Как только 2 пробирается мимо вашей защиты, все идет вниз. – nigel222

+0

@ nigel222 True .. Но это то, что написал OP в своем названии, поэтому я предполагаю, что это тот случай. – Maroun

+1

Как я уже сказал, xor не так. Это просто инстинкт, чтобы рассмотреть возможность плохого ввода и использование несколько неясного отображения одного целого на другое, когда это произойдет, может оказаться «бесполезным». (Я скорее предпочел предложение Бхаргава, '[1,0] [i]' справляется с тем, чтобы создать исключение, если спецификация ошибочна, используя только пять дополнительных нажатий клавиш). – nigel222

Смежные вопросы