《12》データ構造(2)辞書〈Python 2.x 版〉

実録:はじめてのプログラミング記事一覧
《12》データ構造(2)辞書

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

今日の進捗

Comment
本人:野中 言われてたようにクラスが扱えるようになると楽しさが増えて来ます。
担当:伊藤 クラスを利用すると、大きな問題を小さな問題に分割して扱えるようになるだけでなく、完成したプログラムを改良するときにも便利なので、着実に理解できるようになるといいと思います。

ヒストグラム課題(2)辞書

《step 2》テキストファイルを読み込んで、キーワードの出現頻度を求めます。

ヒストグラム課題を作成しながら(引き続き)データ構造について学びます。まず、キーワードの出現頻度を求めるための準備として、英字以外を取り除くフィルターを作成します。

def strip(string):
    s = ""
    for e in string:
        if e.isalpha():
            s += e
        else:
            s += " "
    return s

関数 strip は、引数 string に含まれる英字以外の文字をすべて、空白文字 ' ' に置き換えた文字列 s をリターン値とします。ここでは、メソッド str.isalpha を利用して、英字かどうかを判定します。すると、次のように、

def ex():
    for e in body("queens.py", 14, 18):
        print strip(e)

>>> ex()
    class Queens  
     
        def   init   self  n N   
            self n   n 
            self reset

指定した範囲にあるソースコードの断片を見ると、英字だけが残されて、その他はすべて空白文字に置き換わっているのが分かります。その違いは、次のように、

def ex():
    for e in body("queens.py", 14, 18):
        print e,

>>> ex()
14: class Queens:
15: 
16:     def __init__(self, n=N):
17:         self.n = n
18:         self.reset()

もとのコードの断片と比較すると明らかです。

何が問題か

次に進む前に、このコードに手を加えて、その動作を確認します。

def strip(s):
    return "".join([(" ",e)[e.isalpha()] for e in s])

(step 1 と比較すると)簡潔で見通しの良いコードになっているのが分かります。ここでは(演算子 += に代えて)メソッド str.join を利用して、リスト内の各要素(文字列)を連結します。また、if/else 文に代えて、次のように、

>>> s="A"; ("no","yes")[s.isalpha()]
'yes'
>>> s="@"; ("no","yes")[s.isalpha()]
'no'

Python の歴史的な背景から)真偽 True/False を判定するときに「非零かどうか」という性質を利用できます。

《Note》C言語の三項演算子「?:」と同等の簡潔な表現が可能になります。さらに、この戦略は「n項演算子」にも応用できます。次の Tips を参照してください。《うさぎ》□

Tips

この効能は、コードが簡潔になるだけではありません。strip(string) の戦略は、二者択一の状況では効果的ですが、選択肢が3択/4択/n択になると、すぐに破綻するのは明白です。strip(s) の戦略にすると、要求仕様の変更に際して「より柔軟な構造」を提供できます〈if と別れる50の方法《11》三項演算子の隘路 - 続・ひよ子のきもち〉。その効能は OOP を実践するときに実感できるので、楽しみにしてください。《ひよ子》

Last updated♪09/03/08