tomatoaiu の Tech Blog

プログラミングやツールについてのまとめブログ

【Python + JavaScript】"[要素, 要素][真偽値]"で三項演算子っぽいもの

はじめに

At Coderを利用中に回答を閲覧していて気になるPythonコードがあったので調べてみた。

不思議な構文

気になる見つけたAtCorderのPythonの値を変えてコードを以下に記入した。

print(["No","Yes"]["1" in ["1", "2", "3", "4", "5", "6"]])

これの出力はYesになるん。な〜ぜ?

解説

"1" in ["1", "2", "3", "4", "5", "6"]このコードは、文字列の1が1〜6の文字列を格納している配列の中に存在しているかをtrue or falseで返すコードである。今回の場合だと true になる。つまり["No","Yes"][true]になる。そして、Pythonは、falseやtrueを真偽値が0か1と解釈することもできるため、["No","Yes"][1] となる。これで、添字として配列["No","Yes"]から値を取り出せるみたい。すごいね。

JavaScript

Pythonで上記コードを調査していて、JavaScriptでも試せるのかと思ったので、実際にやってみた。下記コードでいけるのか試す?

console.log(["No","Yes"][["1", "2", "3", "4", "5", "6"].includes("1")]);
undefined

だめだった。trueかfalseで帰ってくるから、includesはできないみたい。

console.log(["No","Yes"][["1", "2", "3", "4", "5", "6"].some(x => x === "2")])
undefined

なので、someも撃沈。0か1を返しくれるようなの思い出せないので、JavaScriptは無理かな。

探してみた

bool to 0 or 1 みたいに検索するとできそうだった!

console.log(["No","Yes"][+ ["1", "2", "3", "4", "5", "6"].includes("1")])
Yes
console.log(["No","Yes"][["1", "2", "3", "4", "5", "6"].includes("1") | 0])
Yes

やったぜ!これでJavaScriptもそれっぽいのが利用できるようになった。まあ、使う機会があればいいけど。

そもそも

JavaScriptなら普通に三項演算子を使えばという。

console.log(["1", "2", "3", "4", "5", "6"].includes("1") ? "Yes" : "no")
Yes

参考文献