too late amatuar programmer

[python]「各条件を満たす最初の要素」★以外★を抽出する方法

2010-07-24 by ebon | Lavel: 0 comment

とあるものを書いていて、

"各条件を満たす最初の要素"★以外★を抽出する

という要件が出てきた.

分解し、各動作の組み合わせで、すぐ解決できそうなものではある.
が、その過程でけっこう頭を悩ましてしまったので、解決方針の考えをまとめておく.
思ったより悩んだ要因として、以下の事がある.

  • 条件は複数ある
  • 最初の要素★以外★を抽出したい の以外の部分

これらの解決法としてどう表現するか?を試行錯誤したログのような記事だと思っていただきたい.

やはり例がないと何がしたいのかも分からないので、簡単な例を用意する.
前段階として考えていくに辺り、★以外★の部分もひとまず邪魔だ、
その部分をまず除き、単純化した要件で考えてみる.

"各条件を満たす最初の要素"を抽出する

こちらの動作で考えてみたい.この動作であれば至ってシンプルかと.
例題を用意する.

例題:
リスト:[6,1,5,3,8,10,11]から、
5より小さい要素・8より大きい要素の、それぞれ条件を満たす最初の要素を取り出せ  

つまり期待する動作としては、以下の動作だ.

f [6,1,5,3,8,10,11] -> [1,10] (3,11は対象にならない)
まずすぐに思いつく方法として、以下のfilterなどでもよくあるやり方がある.

  • 条件を満たす最初の要素をリストから抽出する関数、find()関数を用意する
  • 各条件のリスト([p1,p2,...])を用意する
  • 探索対象のリスト(L)を引数としたfind関数へ、各条件を順次適用する

[python] リストから条件を満たす最初の要素を抽出する関数

2010-07-19 by ebon | Lavel: 0 comment

pythonを書いていたら、おもむろに、以下の動作をする関数が欲しくなった.
" リストから、条件を満たす最初の要素を抽出する "
haskellでいうところの,find()にあたる関数というとイメージしやすいだろうか.

単に、" 一致する最初の要素を抽出する " という要件であれば、.index()メソッドがある.
しかし、求めているものは、完全一致する要素の抽出ではなく、
条件を与え、それを満たす最初の要素を抽出する関数だ.

条件を与えるという点で、" filter的な振る舞いをしつつ、それの真になる最初の要素 "
というイメージになるかな.

buludinメソッドの中に特になさそうだったので、高階関数関連のモジュール,itertoolsを調べてみた.

takewhile():predicateが真である限りiterableから要素を返すイテレータ
dropwhile():predicateが真である限りは要素を無視し、その後は全ての要素を返すイテレータ

というhaskellおなじみの関数はあったが、find()に対応する関数はないようだ.

# 調べ不足でどこかにあるのかもしれない..ただ、それはそれで、後に見つけたときに、
自分のアプローチのダメな点が分かりやすくなるだろうから良しとしたい..

ということで、haskellでいうfind()にあたる関数をpythonで書いてみる.
まず参考に、動かしながら挙動を確認してみようと思い、
takewhileをそのままコピペしたら、

AttributeError: 'list' object has no attribute 'next'

というエラーが出てしまった..そもそも for の中でnext()は呼ばれているはずなので、
ここで,.next()を呼んでいる理由が分からない.
ひとまず流して、、dropwhileの方を参考にする.

[python] テーブルデータを扱う方法を考える

2010-07-12 by ebon | Lavel: 0 comment

unixやlinuxで作業していると、あるコマンドで得た、テーブルデータ式の出力結果を、
管理する良い方法がないか考えるシーンがたまにだが、ある.
e.g) df や mount の出力結果を管理したい時 etc..

pythonの学習を兼ねて、テーブルデータ形式の出力結果を扱う方法を考えてみる.
簡単な例を元に考える.
ファイルや、標準出力で何らか以下のようなデーブルデータ形式のデータを得たとする.

X Y Z
a 1 2
b 3 4
c 5 6

多次元リストにして扱う という方法が通常の?やり方だと思う.
その場合、リストに対して該当列を行番号で指定する方法か、awkのように行ごと処理する
というように、欲しいデータが得られるがやり方がやや気に入らない.
やはりここは、行×列 という形式で各項目を指定することで値を得るようにしたい.

そこで,このテーブル形式のデータについて、

hogehogeのfuga

というより自然な形でアクセスできるようにしたい.


そのためには、 多次元連想配列にしておくと良さそう.
# pythonでは連想配列はディクショナリという.(ハッシュの方が呼びやすいな..辞書と呼ぶものなんだか..)

Casey ReasとBen Fry の 新しいprocessing本

2010-07-03 by ebon | Lavel: 0 comment

Getting Started with Processing
Aruduinoを始めよう と同じくMake の出版だ.
内容はごく基本的な内容のよう.

それよりも、9月に出る予定の本に、期待が持てる.
Form+Code in Design, Art, and Architecture
http://formandcode.com/

コンピューテーショナル・アートの,コード付きサンプル集というコンセプトの本?
言語は特にprocessingという訳でなく、様々な言語によるサンプル集みたい.

上記、Form+Codeのコンピューテーショナルアプローチから連想され、
関連しそうなprocessing本という事で思い出したのが、以下の本.


Algorithms for Visual Design Using the Processing Language
純粋な建築家による,processingを使ったビジュアルデザイン解説本といった内容.
本自体の評判はあまりよろしくない様子.
titleから期待されるほどvisualdesignのアルゴリズムが多く載っている訳でく、
ごく基本的なグラフィッックサンプルが例にあるのみ という事が理由である.

ビジュアルデザインのアルゴリズム知りたい人 → ただのprocessing基本解説
purocessingを学びたい人 → 別に基本を学ぶなら他にいい入門書がある

という状況になっており、中途半端とは言える..
でもこの著者が、

アルゴリズミック・アーキテクチュア

の書き手であるということで印象が変わった.
最近になって著者が建築の人間だと知った...