0
0

More than 3 years have passed since last update.

if文を使わずに1と2を入れ替える

Last updated at Posted at 2020-08-28

「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文を使いましょう。

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0