《47》生成:メソッド fromkeys〈Python 2.x 版〉

実録:はじめてのプログラミング記事一覧
《47》生成:メソッド fromkeys

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
2009年3月19日(木)

今日の進捗

  • The Python Standard Library: Mapping Types — dict
  • Python.use(better) -- セミナー研修テキスト
  • 連想リスト課題を「続・ひよ子のきもち」で公開
Comment
本人:野中 メタプログラミングで固定したい部分と変化させたい部分が混在するときにやや混乱してます。
担当:伊藤/本間 。(^^)

生成:メソッド fromkeys

組み込み型 dict と同様に、メソッド fromkeys を利用して新たな連想リストを作成できると便利です。すると、

def ex():
    m = myDict((e,ord(e)) for e in "ABC")
    print m,"\t#",m.__class__.__name__
    print m.fromkeys("CD")
    print m.fromkeys("CD",0)

    m = myDict((e,ord(e)) for e in "ABC")
    print m,"\t#",m.__class__.__name__
    print m.fromkeys(e for e in m if e>"A")

>>> ex()
{'A': 65, 'B': 66, 'C': 67} 	# myDict
{'C': None, 'D': None}
{'C': 0, 'D': 0}
{'A': 65, 'B': 66, 'C': 67} 	# myDict
{'B': None, 'C': None}

キー要素が存在するときには、値要素を更新しません。例えば、文字列 'A' は存在するので、対応する値 65 は変化しません。
キー要素が存在しないときには、値要素を更新します。例えば、文字列 'D' は存在しないので、対応する値 None を設定します。また、第2引数に値要素を指定できます。例えば、文字列 'E' は存在しないので、対応する値 '0x45' を設定します。
最後の例では、値要素が "A" より大きいものだけを抽出した、新たな連想リストが得られます。

class myList(object):
    ...
    def fromkeys(self, iterable, value=None):
        m = myDict()
        for e in iterable:
            m[e] = value
        return m

指定した引数 iterable に含まれる各要素 e をキー要素にして、指定した引数 value がそれに対応する値要素になる、新たな連想リスト m をリターン値にします。

受講者への課題

VDM++ で規定された演算 <: に準拠した)次のメソッドを実現してください。

class myList(object):
    def domTo(self, iterable):
        ...

>>> m = myDict((e,ord(e)) for e in "ABC"); m
{'A': 65, 'B': 66, 'C': 67}
>>> m.domTo("BD")
{'B': 66}

引数に指定した「シーケンスの各要素」と同じキー要素を含む、新たな連想リストが得られます。ここでは、キー要素 'B' は含まれますが、キー要素 'D' は含まれません。

>>> m2 = myDict((e,ord(e)) for e in "CD"); m2
{'C': 67, 'D': 68}
>>> m.domTo(m2)
{'C': 67}

引数に指定した「連想リスト」と同じキー要素を含む、新たな連想リストが得られます。ここでは、キー要素 'C' は含まれますが、キー要素 'D' は含まれません。

>>> m.domTo(e for e in m if e>"A")
{'B': 66, 'C': 67}

引数に指定した「ジェネレーター式を評価して得られる各要素」と同じキー要素を含む、新たな連想リストが得られます。ここでは、キー要素 'A' より大きな値を持つものだけが得られます。■

Tips

Last updated♪09/03/20