Java/Python 導入ガイド《5》Collection Interface
Java プログラマーのための Python 導入ガイド〈初級/入門編〉《Jython2.5.0》
《5》Collection Interface
》作業中です《 2006年6月30日 (金)
集合:set
>>> def set_filter(c): ... for e in list(c): ... if not cond(e): c.remove(e)
関数 set_filter は、集合 c から、奇数でない要素を削除します。
組み込み関数 list の引数に集合を指定すると、その要素をもとに、新たな list のインスタンスを生成します。すると、for に続く制御変数 e は、集合 c の各要素を「任意の順序で」参照できます。
set 型の組み込みメソッド remove(element) は、集合から要素 element を削除します。条件式 cond(e) を満たさないなら、要素 e を削除します。
>>> c = set(range(5)) >>> c set([0, 1, 2, 3, 4]) >>> set_filter(c) >>> c set([1, 3])
set_filter を利用すると、集合 c から、奇数以外の要素(すべての偶数)が削除されたのが分かります。
写像:dict
>>> def map_filter(c): ... for e in c.keys(): ... if not cond(e): del c[e]
関数 map_filter は、辞書 c から、奇数でないキー要素を含む要素対を削除します。
dict 型の組み込みメソッド keys() は、辞書に含まれるキーを列挙したリスト(キー集合)を生成します。すると、for に続く制御変数 e は、辞書 c の各キー要素を「任意の順序で」参照できます。
演算子 del を dict 型のインスタンスに適用すると、指定された要素対を削除します。条件式 cond(e) を満たさないなら、e をキーとする要素対を削除します。
>>> c = dict([(e,"ABCDE"[e]) for e in range(5)]) >>> c {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E'} >>> map_filter(c) >>> c {1: 'B', 3: 'D'}
map_filter を利用すると、辞書 c から、奇数以外のキー要素を含む要素対が削除されたのが分かります。
《イテレーションの隘路》
イテレーションには厄介な問題があります。
>>> c = set(range(5)) >>> for e in c: ... if not cond(e): c.remove(e) Traceback (most recent call last): File "", line 1, in for e in c: RuntimeError: Set changed size during iteration イテレーションの最中に、要素を追加/削除しようとすると、例外 RuntimeError を生成します。
この問題を避けるために、先の set を扱った例題では、in に続く式は、リストを返す list(c) となっています。なぜなら、リストの場合には、イテレーションの最中に、要素を追加/削除しても問題ないからです。同様に、先の dict を扱った例題では、in に続く式は、リストを返す c.keys() となっています。