「1か2のどちらかが入っている変数を受け取って、1なら2、2なら1を返したい」という状況がありました。
そんな時に使える、1と2を入れ替える便利な書き方を知ったのでメモ。
追記
コメントで指摘を受けて、もっと簡単な書き方がありました。
1と2を入れ替える
n = 1
print(3-n) # 2
m = 2
print(3-m) # 1
0と1を入れ替える
n = 0
print(1-n) # 1
m = 1
print(1-m) # 0
一般化
$x$が$n$と$n-1$のどちらかであるとき、
\begin{eqnarray}
f(x) &=& 2n-1-x\\&=&\left\{
\begin{array}{ll}
n & (x = n-1) \\
n-1 & (x =n)
\end{array}\right.
\end{eqnarray}
証明するまでもなく自明。
というわけで、ここまでの話で十分なので残りは読まなくていいです。
読まなくていいやつ(元の記事)
元の記事を一応残しておきます。
1と2を入れ替える書き方
n = 1
print(n%2+1) # 2
m = 2
print(m%2+1) # 1
これだけ。
他の数字について考えてみよう
これだけじゃ記事にならないので、頭の体操として他の数字について考えてみる。
0と1を入れ替える
0と1を入れ替えることを考えてみよう。boolで扱うとかはなしで。
n = 1
print((n+1)%2) # 0
m = 0
print((m+1)%2) # 1
できた。
2と3を入れ替える
同じように2を3、3を2に入れ替えてみる。
n = 2
print((n+1)%2+2) # 3
m = 3
print((m+1)%2+2) # 2
3と4を入れ替える
3を4、4を3に入れ替えてみる。
n = 3
print(n%2+3) # 4
m = 4
print(m%2+3) # 3
一般化してみよう
$2n$と$2n-1$を入れ替える場合と$2n$と$2n+1$を入れ替える場合で計算式が変わる。
$2n$と$2n-1$を入れ替える場合
\begin{eqnarray}
f(x) &=&x \bmod 2 +2n-1 \\&=& \left\{
\begin{array}{ll}
2n & (x = 2n-1) \\
2n-1 & (x =2n)
\end{array}
\right.
\end{eqnarray}
$2n$と$2n+1$を入れ替える場合
\begin{eqnarray}
f(x) &=&(x+1) \bmod 2 +2n \\&=& \left\{
\begin{array}{ll}
2n & (x = 2n+1) \\
2n+1 & (x =2n)
\end{array}
\right.
\end{eqnarray}
~~適当に書きながら考えているので、もっと効率のいい書き方があるかもしれません。~~ありました(記事上部)。
まとめ
迷ったらif文を使いましょう。