Hatena::ブログ(Diary)

ミームの死骸を待ちながら このページをアンテナに追加 RSSフィード

We are built as gene machines and cultured as meme machines,
but we have the power to turn against our creators.
We, alone on earth,
can rebel against the tyranny of the selfish replicators.
- Richard Dawkins "Selfish Gene"

Add to Google Subscribe with livedoor Reader はてなRSSに追加

Jun 25(Thu), 2009

Rubyの配列でごにょごにょするときzipとinjectとevalが便利すぎる件

先日「ブログ書きが不調」と書いたが、言語アウトプットが不調なときは、それ以外のことをするに限る...たとえば黙々とプログラムを書く、音楽に浸る、身体を酷使する、などだ。というわけで月曜日、天気は晴れなかったものの、研究データ処理に使うRubyスクリプトを書きまくって鬱憤を晴らしていた。

ところがそのプログラム脳のまま夜にはVimM#4に行こうとした時、そういえば内定者3人によるSkype会議が予定されていた(つまりダブルブッキング)ことを思い出し、自分阿呆さに呆れ、本当にすみません、でもって結局気分は晴れず。

前置き(ただの日記)終わり。



本題。

Ruby配列でいろいろいじる時に、for i in ...と array.each でだいたいできるんだけど、もちっとスマートにやりたいなぁと思って調べていたらこれ使えるんじゃね?と気がついたことがいくつかある。zipとinjectとevalの一般的な(たぶん)使い方を自分なりに書く。素人なので間違ってたり無意味だったりもあるので注意。



Enumerable#zip

Array#zip

zipは任意の数の配列を元に、同じ順番でまとめた配列を生成する。たとえばこうやって使うと、配列を返す。



hiragana = ["", "", "", "", ""]
alphabet = ["a", "b", "c", "d", "e"]
number = [1, 2, 3, 4, 5] #Fixnum class

p number.zip(alphabet)
#=> [[1, "a"], [2, "b"], [3, "c"], [4, "d"], [5, "e"]]

p hiragana.zip(alphabet, number)
#=> [["あ", "a", 1], ["い", "b", 2], ["う", "c", 3], ["え", "d", 4], ["お", "e", 5]]

p number.zip(alphabet, hiragana)
#=> [[1, "a", "あ"], [2, "b", "い"], [3, "c", "う"], [4, "d", "え"], [5, "e", "お"]]

そして、下にブロックを置くと、index順に一個ずつ取り出して処理することができる。


number.zip(hiragana, alphabet){|n, h, a|
  print "number is #{n}, alphabet is #{a}, and hiragana is #{h}\n"
}

# =>
# number is 1, alphabet is a, and hiragana is あ
# number is 2, alphabet is b, and hiragana is い
# number is 3, alphabet is c, and hiragana is う
# number is 4, alphabet is d, and hiragana is え
# number is 5, alphabet is e, and hiragana is お

巨大な配列index順に処理したかったので助かった。ループ3重にまわすのとどっちが速いのか知らんけど。



Enumerable#inject

数学的帰納法、つまりn個目の要素に何か処理をしてn+1を作り出す、その操作を要素の数だけ繰り替えしたい時に使うメソッド。injectの一番簡単な使い方は、

ary = [1,2,3,4,5,6,7,8,9,10]
ary.inject(0) {|sum, i|
    sum + i
}

解説を加えようとしたが ruby の inject をわかりやすく説明してみる - Moderation is a fatal thing. Nothing succeeds like excess. に非常にわかりやすく書かれていたのでまあいいやw 以下、フィボナッチ数列の例を引用

(0..10).inject([1, 1]) {|fib, i| fib << fib[i] + fib[i+1] }

なるほど。適当に考え方を箇条書きしてみると


  • iの初期値は引数として与える*1
  • ブロックの返り値がsumに格納される
  • 配列の次の要素がiとなって、次の周が回り始める。

こんなところか。

なんとなくRでやるとどうなるかなとか考えたけど考えただけだった。相変わらずHow toの段階で悪戦苦闘しており、Rでいじるほどの研究データが出ない(定性的なのしか出ない)。楽しいんだけどな...外部的な価値はない。



eval


evalは、与えられた文字列Rubyコードとして解釈する。これすごい強力だな。 複数の配列に対して同じ処理をしたかったのだけど、evalで一発解決ですよ奥さん。先ほどのinjectと会わせてすっきりと書いた。気持ちいい。

%w(@aryX @aryY @aryZ).each do |a| 
  sum = 0, n = 0 
  eval(a).inject(eval(a)[0]) {|sum, n| sum + n}
  averageCorrdinates << sum/eval(a).length
end   

eval多用すると危険らしいのだけど、どう危険かよくわからん。ローカルで手動で使う分には大丈夫じゃないかと踏んでいる。これeval使わずにできるのかな。



なにやってんの


作ってたのはぴーでぃーびーをいじるスクリプトで、完成品は githubの”lab”ディレクトリ に置いてある。

平行移動、回転、指定領域の分子を複製などの機能をメソッドとして持たせた。rubyで実行する際に引数オプションいれてやれば使える。bioruby使ううえに糞コードだけどよかったらどうぞ。

Rubyでぴーでぃーびーふぁいるをいじるというのは、検索すると僕のブログリファレンスしか出ないというひどい状況なのでしっかり解説したりあれこれ検討したいんだけど、研究室ブログを隠しているのでおおっぴらに研究関連の話書けない*2のが悩みどころ。

顔も名前も出してるくせになんで秘密にしているかというのはハックルさんと会ってきた際の記事で少し触れた。

まぁ、どんどん外堀が埋められており、もはやバレるのも時間の問題かもしれないが、卒業まで隠し通せれば御の字。で、最終的にバレてないと思っているのは僕だけになってたりしてな。

*1:inject(0)の0がそれ。デフォルトは0だっけ

*2:以前サブブログに授業の課題論文をのせたら速攻検索した友人に発見された。

ujihisaujihisa 2009/06/26 11:51 最後の例、なぜevalしているか分からない。単に
%w(@aryX @aryY @aryZ).each do |a|
ではなく
[@aryX @aryY @aryZ].each do |a|
でループを回せばいいのではないか。


# 修論のRubyがinjectまみれになったのが懐かしい... あまりにinjectばかりになるので、HaskellのconcatMapとかを移植して語彙を増やしてた気がする。

HashHash 2009/06/27 12:51 本当だ…。普通に配列の配列作ればいいし。
injectには中毒性がありますね

アナスイ 財布アナスイ 財布 2011/05/30 19:26 ANNA SUI(アナスイ) 財布,ANNA SUI(アナスイ) 財布 の正規通販サイトなら、こちらへどうぞ!
アナスイ 財布 蝶_ANNA SUI 財布_ANNA SUI(アナスイ) 財布,ANNA SUI(アナスイ) ポーチのオンライン格安通販専門ショップ!

アナスイ 財布:http://www.fashionworld.jp/category-58-b0.html

MicrosoftMicrosoft 2011/05/30 19:27
Microsoft Office Professional 2007 日本語:http://www.linksinfostore.com/goods-19.html
Microsoft Office プロフェッショナル 2007 日本語:http://www.linksinfostore.com/goods-19.html
プロフェッショナル 2007 日本語:http://www.linksinfostore.com/goods-19.html

レイバンレイバン 2011/10/19 17:42 世界一有名な偏光サングラス安いのRay Ban/レイバン 通販.レイバン メガネ,レイバン サングラス,レイバン 伊達メガネ,レイバン メガネフレーム,レイバン サングラス スポーツの販売。
Ray Ban/レイバン 通販:http://www.raybans.jp
ray ban/レイバン サングラス 通販:http://www.raybans.jp/category-1-b0.html
レイバン 偏光サングラス:http://www.raybans.jp/category-3-b0.html
レイバン めがね,レイバン 眼鏡,レイバン 伊達メガネ:http://www.raybans.jp/category-7-b0.html

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証