Skip to content.

kagome.lab.tkikuchi.net

Sections
Personal tools
You are here: Home » Members » tkikuchi's Home » 授業 » 専門コア情報処理演習(2006) » ディクショナリ
Views

ディクショナリ

Document Actions
例によって ~/python/12 で

ディクショナリ

  • ディクショナリは順番を持たないデータの集合です
  • 「キー」(検索鍵)を使って参照します
  • { } (ブレース) の間に「キー : (コロン) 値」のペアを , (コンマ) で区切って記します
    • 注 教科書では, p119 (6.3 ディクショナリ) に書いてあります。Python の持つ便利な機能のひとつで,内部的に用いられている「ハッシュ」は基本的なプログラミングテクニックで2/3回生の授業でも取り上げられます。ここでは利用例を取り上げて勉強します。

{}
空ディクショナリ
d = {'spam': 2, 'eggs': 3}
'spam', 'eggs' をキーとする 2要素のディクショナリ
d['spam']
d の中から 'spam' をキーとする要素の値 (2) を取り出す
d.has_key('eggs')
d のキーの中に 'eggs' があるかを検査する

例(continued)

d.keys()
d のキーをリストとして取り出す ['spam', 'eggs']
d.values()
d の値をリストとして取り出す [2, 3]
d['bacon'] = 4
d に新しい要素を追加
del d['spam']
要素を削除

実行例

  • >>> d = {'spam': 2, 'eggs': 3}
    >>> d['spam']
    2
    >>> d.has_key('eggs')
    True
    >>> d.keys()
    ['eggs', 'spam']
    >>> d.values()
    [3, 2]
    >>> d['bacon'] = 4
    >>> d
    {'eggs': 3, 'bacon': 4, 'spam': 2}
    >>> del d['spam']
    >>> d
    {'eggs': 3, 'bacon': 4}
    

プログラム例

  • 第10回でやった、いちご占いのプログラムでは、if によって 占い文を選んでいました。ここでは、ディクショナリを使ってみます。
  • フルーツと占い文が増えた場合にも、 ディクショナリに追加するだけで、 プログラムの実行部分は変更せずにすみます。

プログラム例 (continued)

  • #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # a.py
    # いちご占い
    print '*** いちご占い ***'
    fortune = {
        'いちご': '幸運が訪れます',
        'みかん': '努力が必要です',
        'りんご': '我慢が必要です'
    }
    ans = raw_input('好きなフルーツの名前をどうぞ: ')
    if fortune.has_key(ans):
        print '%sの好きなあなたには%s.' % (ans, fortune[ans])
    else:
        print '%sの好きなあなたは健康に気をつけてください.' % ans
    

実行例

  • $ ./a.py
    *** いちご占い ***
    好きなフルーツの名前をどうぞ: いちご
    いちごの好きなあなたには幸運が訪れます.
    $ ./a.py
    *** いちご占い ***
    好きなフルーツの名前をどうぞ: なし
    なしの好きなあなたは健康に気をつけてください.
    

プログラム例(2)

  • 次のプログラム例は,文中に現れる単語とその数を数えるために,ディクショナリを用いたものである。
  • #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # b.py
    # 単語を数え上げる
    #
    def wordcount(s):
        # {単語: 出現数} のディクショナリを初期化
        words = {}
        for w in s.split():
            # 単語の後に付く句読点を削除
            if w[-1] in ',.:;?':
                w = w[:-1]
            # 小文字に統一
            w = w.lower()
            # 単語が登録済みであれば
            if words.has_key(w):
                words[w] += 1  # 出現数を +1
            else:
                words[w] = 1   # なければ新規登録
        return words
     
    a = """Aspiring sincerely to an international peace based on justice and
    order, the Japanese people forever renounce war as a sovereign right of
    the nation and the threat or use of force as means of settling international
    disputes. 2) In order to accomplish the aim of the preceding paragraph,
    land, sea, and air forces, as well as other war potential, will never be
    maintained. The right of belligerency of the state will not be recognized.
    """
    words = wordcount(a)
    for w in words.keys():
        print '%-15s %2d' % (w, words[w])
    

問題1

  • a.py のユーザ対話の部分を次の例(q1.py)のようにループに入れると,何度も占いを実行できる。このプログラムをさらに改造して、新しい果物について占い文を追加できるようにしなさい。
  • #!/usr/bin/env python
    # q1.py
    # いちご占い
    print '*** いちご占い ***'
    fortune = {
        'いちご': '幸運が訪れます',
        'みかん': '努力が必要です',
        'りんご': '我慢が必要です'
    }
     
    while 1:
        ans = raw_input('好きなフルーツの名前をどうぞ: ')
        if not ans:
            print '********* さようなら *********'
            break
        if ans in fortune.keys():
            print '%sの好きなあなたには%s.' % (ans, fortune[ans])
        else:
            print '%sの好きなあなたは健康に気をつけてください.' % ans
    
  • 次の実行例を参考にすること。
  • $ ./q1.py
    *** いちご占い ***
    好きなフルーツの名前をどうぞ: ばなな
    ばななのことは知りません。教えてください: 忍耐が必要です
    好きなフルーツの名前をどうぞ: ばなな
    ばななの好きなあなたには忍耐が必要です.
    好きなフルーツの名前をどうぞ:
    ********* さようなら *********
    

問題2.

  • 教科書 p101 には、文字列フォーマットにディクショナリを用いる 方法が書いてある。これを用いて、以下のようなプログラムで 住所録を印刷するようなデータ形式を考えて、サンプルのデータを 書き入れなさい。
  • #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # q2.py
    # 住所録
    addressbook = ...
     
    for name in addressbook.keys():
        print name, '%(postal)s %(address)s' % addressbook[name]
    
  • 実行例
  • $ ./q2.py
    豊永昌彦 780-8520 高知市曙町2-5-1
    菊地時夫 780-8072 高知市曙町1-17-8
    

解答は、"メール":mailto:tkikuchi+ci2006@is.kochi-u.ac.jp?subject=12_Dictionary で送ってください。

また,今回の演習の結果できたファイルはそのまま ~/python/12 に残しておいてください。評価の対象とします。

Created by tkikuchi
Last modified 2007-02-16 21:29
 

Powered by Plone

This site conforms to the following standards: