Google ClassroomGoogle Classroom
GeoGebraGeoGebra Classroom

filterをやろう

Image

プログラミングの鍵は条件分岐

このワークシートはMath by Codeの一部です。 <filterをやろう> 前回のmapでは、リストをmapを使って編集することを学んだね。 今回はfilterを使って、リストから制限リストを作ってみよう。 map(x->f(x),リスト)などとかいて、要素xからf(x)のリストをマッピングできる。 filter(x->expr(x),リスト)などとかいて、要素xのうちexpr(x)が成り立つ要素だけリストができる。 前回は乱数の2次元配列を作って50行5列の得点表を作り、 平均点以上なら+、 未満ならーにマッピングしたね。 今回は乱数の2次元配列を作って50行5列の得点表を作り、 5科目のすべて、平均以上か、平均未満に偏るデータだけ抜き差し出そう。 mapを使って+ーのリストのリストは作れる。 filterを使って、+が5個ならぶデータかーが5個並ぶデータを抜き出せばよいね。 geogebraではKeepIf( <条件>, <リスト> ),KeepIf( <条件>, <変数>, <リスト> )を使おう。 juliaの場合 #============================================ num = 50 kamoku = 5 data=[[rand(0:100) for x in 1:kamoku] for y in 1:num] ave= sum([sum(data[y]) for y in 1:num])/(num*kamoku) updown(x) = float(x) >= ave ? 1 : -1 res = [ map(x -> updown(x) , data[y]) for y in 1:num] judge= [sum(res[y]) for y in 1:num] filtered=filter(n -> n == 5 || n == -5, judge) println(judge) println(filtered) #============================================ [OUT]例 [-5, 1, 1, 1, -3, 1, 1, -1, 3, -1, 1, 5, -5, -1, 5, 1, -1, 1, 3, -5, 1, -3, 1, 1, -3, 3, 3, -1, 1, -1, 3, -1, 1, 3, -1, -1, -1, 1, -1, -1, 3, -3, -3, 1, 3, -1, -3, 3, 3, 3] [-5, 5, -5, 5, -5] geogebra #============================================ num = 50 kamoku = 5 data=Sequence(Sequence(RandomBetween(0,100),n,1,kamoku),m,1,num) ave=((Sum(Sequence(Sum(data(n)),n,1,num)))/(num kamoku)) rs=Sequence(Sequence(If(Element(data,m,n)≥ave,1,-1),n,1,kamoku),m,1,num) judge=Sequence(Sum(Element(rs,n)),n,1,num) filtered=keepIf(n == 5 || n == -5, n, judge) #============================================

mapを利用して、リストにフィルターをかけてみよう

質問:0点から100点までありうる5科目の得点データがあるとき、1科目でも100点か0点を取った人を抜き出したい。どうしたらよいだろうか。
前回と同じように、rustで作ってみよう。 まず、データ作成は前回と同じでいいね。 use rand::{Rng};//乱数を使うためのクレートと関数をかく fn main() {     //50行5列の0以上100以下の乱数の得点表を作る。     //0点か100点を取った人の5科目の得点リストを抜き出したい。     let num = 50;     let kamoku = 5;     let mut rng = rand::rng();//乱数のもとを作る。     //データ作成***************************************     let data:Vec<Vec<i32>> =     (0..num).map(|_|         {(0..kamoku).map(|_| rng.random_range(0..=100)).collect()} //kamoku数だけ発生してあつめる。         ).collect(); データdataにフィルターをかけよう。 1人1人の点数を&tenで参照し、|&ten| ten==0 || ten==100という条件を後ろに書こう。 前回と同様に、対象から要素と操作へという順にかくことを意識する。 dataにフィルターをかける。それはfilterでできるけど、mapと同じく、イテレーション(走査)の 機能だから、data.iter().filter( 要素と操作)とかこう。 ただ、いきなり点数に行かず、人を要素として調べる。 それが、|hito| hito.iter().any(得点と操作)だ。 だから、2重構造の式になる。そこで得た式の値をcollect()で収集して、変数にセットすればよいね。     //フィルターをかける**************************************     let selected_hito: Vec<&Vec<i32>> =         data.iter().filter(|hito| hito.iter().any         (|&ten| ten == 0 || ten == 100))         .collect();     println!("{:?}",selected_hito); }