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

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

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

今日の進捗

  • Tutorial: Brief Tour of the Standard Library
  • Python.use(better) -- セミナー研修テキスト
  • ヒストグラム課題を「続・ひよ子のきもち」で公開
Comment
本人:野中 伊藤さんとは今日までですね。いろいろとありがとうございました。
担当:伊藤 インターンシップでは、Java/C#などを利用するかもしれませんが、今回のPythonで学んだ経験は、きっといつかどこかで役立つと思います。

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

実録 はじめての…《12》データ構造(2)辞書 - 続・ひよ子のきもち〉で作成した関数 strip を利用して、ヒストグラム課題を完成させると、次のようになります(未完)。

keywords = (
    "and",
    "class",
    "def",
    "del",
    "elif",
    "else",
    "for",
    "if",
    "import",
    "in",
    "not",
    "or",
    "print",
    "return",
    )

def ex():
    histo = dict*1
        
    keys = histo.keys(); keys.sort()
    print keys                                     # (2)
    for e in keys:
        v = histo[e]
        print format%(e, v, scale(v))

(ここでは課題として)組み込み型 dict のメソッド keys/values/items などを利用しています。すると、

>>> ex()
{'and': 2, 'elif': 0, 'or': 0, 'return': 2, 'for': 3, 'else': 2, 'print': 7, 'del': 1, 'in': 4, 'not': 3, 
'import': 1, 'class': 1, 'def': 8, 'if': 7}
   and[2]..
  elif[0]
    or[0]
return[2]..
   for[3]...
  else[2]..
 print[7]....+..
   del[1].
    in[4]....
   not[3]...
import[1].
 class[1].
   def[8]....+...
    if[7]....+..
['and', 'class', 'def', 'del', 'elif', 'else', 'for', 'if', 'import', 'in', 'not', 'or', 'print', 'return']
   and[2]..
 class[1].
   def[8]....+...
   del[1].
  elif[0]
  else[2]..
   for[3]...
    if[7]....+..
import[1].
    in[4]....
   not[3]...
    or[0]
 print[7]....+..
return[2]..

この結果を見ると、最多のキーワードは def で、その出現頻度は 8 だと分かります。

何が問題か

また、メソッド list.sort の副作用を期待しているときには、次のようにしても、

    keys = histo.keys().sort()        # Boo!

(リターン値として None が得られ)期待した結果は得られないので、注意が必要です。
《Note》ここで利用した関数/メソッド群(紹介しなかった各論)については〈関連記事〉に譲ります。クラスについて学習した後で、この課題を再構成するので、楽しみにしていてください。□

Tips

ここでは「副作用を期待している」という注意を促すために、セミコロン「;」を使って、コードの断片を「同じ行に」記述しています。これも、書き手の意図を読み手に伝えたいときの工夫のひとつです。《うさぎ》

Last updated♪09/03/08

*1:e,0) for e in keywords) for s in open("queens.py"): for e in strip(s).split(): for word in keywords: if e == word: histo[e] = histo.get(e, 0)+1 print histo # (1) format = "%%%ds[%%%dd]%%s"%( max(len(e) for e in histo), len(str(max(histo.values()))), ) for k,v in histo.items(): print format%(k, v, scale(v