Java/Python 導入ガイド《5》Collection Interface

記事一覧入門編基礎編応用編中級編

Java プログラマーのための Python 導入ガイド〈初級/入門編〉《Jython2.5.0》
《5》Collection Interface

《著》森こねこ・本間りす・小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03

》作業中です《 2006年6月30日 (金)

■ 概要

Java™ Programming Language〔JPL〕の事例を使って、JavaJython との違いを学びます。

集合: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() となっています。

Last updated♪2009/08/03