ディクショナリ

菊地時夫 先生のオンラインテキスト( 最終変更日時 2007年07月05日 16時44分)に基づいて追加情報を付加しています。

以下の作業は‾/python/06 を作成して、そこで実行する

ディクショナリ

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

{}
空ディクショナリ
d = {'spam': 2, 'eggs': 3}
'spam', 'eggs' をキーとする 2要素のディクショナリ
d['spam']
d の中から 'spam' をキーとする要素の値 (2) を取り出す
d.has_key('eggs')
d のキーの中に 'eggs' があるかを検査する
     Python3ではつかえない。 かわりに 'eggs' in d  を使う (key in dictionary)
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)    

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

実行例



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

プログラム例(2):授業では飛ばします。各自見ておいてください。

  • 下記のプログ ラム例は単語の数を数えるのに ディクショナリを用いた物である。
  • b.py
#!/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])


課題

以下の問題をといて,解答(スクリプト,モジュール(添付するとともに本文にもコピー)と実行例) をメールで送ってください。作業はpython/06のなかで行うものとし,作成したスクリプトは残しておいてください 。(評価の対象とします)。 メールあて先:           honda@is.kochi-u.ac.jp

サブジェクト名:        p6 kadai

締め切り       :           1/9 17:00

問題1

    a.py のユーザとの対話の部分を次の例(q1.py)のように、ループの中に入れると,何度も占いを実行できる。
    このプログラムを変更して、新しい果物名が入力 されたときには、その占いの結果をユーザーに聞いて占
    いに追加し、くりえし占いができるようにしてください。

    ヒント(ディクショナリの要素の追加を行うように、赤字のブロックを修正すればよい。。。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# q1.py
# いちご占い
print '*** いちご占い ***'
fortune = {
'いちご': '幸運が訪れます',
'みかん': '努力が必要です',
'りんご': '我慢が必要です'
}
 
while 1:
ans = raw_input('好きなフルーツの名前をどうぞ: ')
if not ans:
print '********* さようなら *********'
break
if fortune.has_key(ans):
print '%sの好きなあなたには%s.' % (ans, fortune[ans])
else:
print '%sの好きなあなたは健康に気をつけてください.' % ans
  • 次の実行例を参考にすること。
$ ./q1.py
*** いちご占い ***
好きなフルーツの名前をどうぞ: ばなな
ばななのことは知りません。教えてください: 忍耐が必要です
好きなフルーツの名前をどうぞ: ばなな
ばななの好きなあなたには忍耐が必要です.
好きなフルーツの名前をどうぞ:
********* さようなら *********