We love MLP

技術を習得したら、忘れずにメモを書く場所

Python : any(),all() とリスト内包表記のコンボパターン

こんにちは。みなさん元気でしょうか。最近いいところに就職しろと夢の中や、周囲の声がやまないです。(あまり興味ないので、そういう圧は疲れます)

any,allとリスト内包表記のコンボが強い

最近、HackerRankの方にはまってしまい、問題を解くのが面白く、議論も活発なので、そこで遊んでいます。今回は、Pythonでの問題で新しい発見をしたので、こちらにメモ。

まず、any()とかall()とか何よ。

リストのようなイテレータを差し込むと、その中のTrue-Falseを全部読んで、

どれか1つがTrueならTrue→any() 要素全てがTrueなら、True→all()

という具合です。

listA=list(map(int,"1 2 3 4 5 -9".split()))
#listA = [1 2 3 4 5 -9]
any(listA) #True
all(listA) #True
li.append(0)
any(listA) #True
all(listA) #False

こんな感じ。intならどれか一つが0ならFalse扱いだし、それ以外はTrueと言った具合。

リスト内包表記にしたらどう強いんだ??

まずリスト内包表記ってのは、下記のように書くことを言います

listA = list(map(int,"1 2 3 4 5".split()))
#listA = [1 2 3 4 5]
listB = [ num for num in listA ] 
#listB = [1 2 3 4 5]

ここでのlistBへの代入はlistB = listA[:]ってしてるのと変わんないんですけども、ここで一番いいことは、numに対してちょっかいを出せるという所にあります。

listA = list(map(int,"1 2 3 4 5".split()))
#listA = [1 2 3 4 5]
listB = [ num*2 for num in listA ] 
#listB = [2 4 6 8 10]
listC = [ num%2 for num in listA ]
#listC = [1 0 1 0 1]

つまり、ここの部分に条件式を与えてしまえば・・・

listA = list(map(int,"1 2 -1 0".split()))
#listA = [1 2 -1 0]
listB = [ num % 2 == 0 for num in listA ]
#listB = [ False True False True ]
listC = [ num > 0 for num in list A ]
#listC = [ True True False False ]

という具合です。競プロだと、このany()all()とリストのコンボを使うと早く問題を解けるパターンがあるので、覚えておきたいですね。

使用例を書きたかったんですけど、HackerRankのPythonでAnyAllの問題を探せば問題出てきますので、ぜひ解いてみてください。

今日はこの辺で。