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の問題を探せば問題出てきますので、ぜひ解いてみてください。
今日はこの辺で。