Yamamoto's Laboratory
 
環境設定
 
プログラム作成
  書き方
 
 辞書
 
 
 
tkinter
 
 
 
 
 
 

はじめに

辞書とは

配列は整数でデータにアクセスしますが,辞書型 (ディクショナリー) はキー (通常は文字列) を指定することでデータにアクセスします.他のプログラミング言語のハッシュや連想配列と似ています.これはシーケンス型と同じく複数の要素から構成されます.しかし,シーケンス型と異なり要素間には順序はありません.コロンで分けたキーと値の組を波括弧で囲むこで,辞書型のオブジェクトが作成されます.

{キー1:値1, キー2:値2, キー3:値3, キー4:値4}

辞書オブジェクトに角括弧をつけキーを指定すると,値を取り出すことが出来ます.

辞書オブジェクト[キー]

単純な例

最も簡単な例を以下に示します.キーと値が文字列です.

辞書を使ったプログラム例 実行結果
animal = {'cat':'ねこ', 'dog':'いぬ', 'sheep':'ひつじ'}

print(animal['cat'])
print(animal['dog'])
print(animal['sheep'])
ねこ
いぬ
ひつじ

値について

ディクショナリ値には,どんな Python のオブジェクトも指定可能です.文字列や数値,シーケンスなどの標準なオブジェクト,インスタンスなどのユーザ定義オブジェクトを値にすることが可能です.

Python の辞書の様々な値の例 実行結果
class Hoge:
    def prt(self):
        return 'これはクラスのインスタンス'

if __name__ == '__main__':
    def f(x):
        return 2*x
    
    inst = Hoge()
    lst  = [0, 3, 6, 9, 12, 15]
    svar = '文字型の変数'
    sub_dic  = {'cat':'猫', 'dog':'犬', 'sheep':'羊'}

    dic ={'ins':inst, 'func':f, 'list':lst, 'string': svar, 'dic':sub_dic}

    print(dic['ins'].prt())
    print(dic['func'](1111))
    print(dic['list'][4])
    print(dic['string'])
    print(dic['dic']['cat'])
これはクラスのインスタンス
2222
12
文字型の変数
猫

キーについて

キーには文字列以外のオブジェクト,たたえば整数も使えます.もっと言えば,変更できないオブジェクト (イミュータブル) であれば,どれもキーになります.その例を以下に示します.

Python の辞書の様々な値の例 実行結果
class Hoge:
    def prt(self):
        return 'これはクラスのインスタンス'

if __name__ == '__main__':
    def f(x):
        return 2*x
    
    dic ={'dog':'犬', 1:'one', 3.14:'pi',\
          (2,4):'タプル', f:'関数', Hoge:'クラス'}

    print(dic['dog'])
    print(dic[1])
    print(dic[3.14])
    print(dic[(2,4)])
    print(dic[f])
    print(dic[Hoge])
犬
one
pi
タプル
関数
クラス

辞書のキーとなり得ないイミュータブルなオブジェクトには,list(リスト) と dict(辞書), set(集合), bytearray(バイトアレイ)が有ります.

辞書の作成

ここでは,辞書の代表的な使い方を示します.

リレラル

以下の例は,プログラム中で辞書オブジェクト作成し,変数に代入します.そして,キーを指定し値を取り出してます.この例から分かるように,整数のキーも使えます.実行結果は以下のとおりです.

リテラルを使った辞書作成の例 実行結果
# ----- 辞書の作成 -----
doraemon = {'name':'ドラえもん', 'birthday':'2012/9/3', \
            'height':129.3,\
            0:3.1415, 1:2.71828, 2:'のび太'}

# ----- 値の取り出し ---
print(doraemon['name'])
print(doraemon['birthday'])
print(doraemon['height'])
a=0
print(doraemon[a])
print(doraemon[a+1])
print(doraemon[a+2])
ドラえもん
2012/9/3
129.3
3.1415
2.71828
のび太

シーケンスから作成

タプルやリストなどのシーケンスを使うと,より洗練された辞書の作成が可能です.

zip()関数を使い二つのシーケンスを接続します.これは,二つ以上のシーケンスの各々の要素で新たなシーケンスを作ります.要素数が異なる場合は,最も要素数の少ないシーケンスに合わされます.ここでは,最終的にはdict()で型変換します.

シーケンスを使った辞書作成の例 実行結果
key   = ('name', 'weight', 'height')
robo1 = ('ドラえもん', 129.3, 129.3)
robo2 = ('ドラミ', 100, 91)
doraemon = dict(zip(key, robo1))
dorami   = dict(zip(key, robo2))

for k in key:
    print('{0}: {1}\t{2}'.format(k, doraemon[k], dorami[k]))
name: ドラえもん   ドラミ
weight: 129.3   100
height: 129.3   91

辞書の呼び出し

for を使い連続呼び出し

辞書の内容をひとつづつ処理する場合,for が便利です.その例を以下に示します.

forを使った読み込みの例 実行結果
# ----- 辞書の作成 -----
doraemon = {'name':'ドラえもん', 'birthday':'2012/9/3',\
            'height':129.3,\
            0:3.1415, 1:2.71828, 2:'のび太'}

print("\n----- key, value -----")
for key,value in doraemon.items():      # キーと値の取り出し
    print("{0}\t{1}".format(key,value))

print("\n ----- key ----")
for key in doraemon:         # キーの取り出し
    print("{0}".format(key))
----- key, value -----
0   3.1415
birthday    2012/9/3
2   のび太
height  129.3
1   2.71828
name    ドラえもん

 ----- key ----
0
birthday
2
height
1
name

items()メソッドを使うことによりキーと値のリストが組となったリストになります.繰り返しを「for 変数 in 辞書:」とすると,辞書のキーのみが変数に代入されます.

辞書の演算子・メソッド

演算子

辞書のキーや値は,インデックス指定の他にアンパックを使って取り出すことも可能です.

辞書のアンパックの例

001   # -*- coding:utf-8 -*-
002   
003   # ----- アンパックを使って関数の引数に -----
004   def print_profile(name=None, birthday=None, height=None):
005       print("名前: ", name)
006       print("生年月日: ", birthday)
007       print("身長: ", height)
008   
009   # ----- メイン関数 -----
010   if __name__ == "__main__":
011       doraemon = {'name':'ドラえもん', \
012                   'birthday':'2012/9/3', 'height':129.3}
013   
014       # -- アンパック --
015       a, b, c = doraemon
016       print("a={0:s}\tb={1:s}\tc={2:s}".format(a, b, c))
017       print("*doraemon=", *doraemon)
018       print_profile(**doraemon)

これを実行すると,スクリーン上に以下が得られます.

実行結果

a=height    b=name  c=birthday
*doraemon= height name birthday
名前:  ドラえもん
生年月日:  2012/9/3
身長:  129.3

005行の代入 (=) の右辺がシーケンス — ここでは辞書の場合 — 左辺の変数にはシーケンスがアンパックされて変数に代入されます.辞書の場合,アンパックではキーが返されます.017行では,アスタリスク演算子 (*) を使って,アンパックしています.ここでもキーのみが返されます.アンパックで,最も有用なのは 018 行です.ふたつのアスタリスク (**) を使い,アンパックし,メソッドの引数に渡しています.動作は見てのとおりです.

メソッド

辞書クラスには,以下のメソッドを使うことができます.

メソッド (関数) 動作
clear() すべての辞書の要素 (キー, 値) を削除し,空の辞書を返す.
copy() 辞書のコピーを返します.
fromkeys(seq[, v]) シーケンス seq の値をキーとした新しい辞書を返します.値 v を指定することもできます.指定しない場合,デフォルトの'None' です.
get(key[,d]) キーの値を返します.キーが無い場合は,d を返します.デフォルトは None です.dec[key] の場合,キーがない場合エラーになりますが,dic.get(key)はエラーになりませんので便利です.
items() 辞書のタプル(キー, 値)のリストを返します.
keys() 辞書のキーのリストを返す.
pop(key[,d]) キーのアイテムを削除し,その値を返します.キーが無い場合,dを変えします.dが指定されずにキーが見つからない場合、KeyErrorが発生します.
popitem() 任意の項目 (キー, 値) を削除して返します.辞書が空っぽの場合,キーエラーになります.
setdefault(key[,d]) キーが辞書にある場合は,その値を返します.そうでない場合は、値dのキーを挿入しdを返します (デフォルトはNone).
update([other]) 他のキー/値ペアで辞書を更新し,既存のキーを上書きします.
values() 辞書の値のリストを返す.

ページ作成情報

参考資料

  1. PythonWeb辞書(ディクショナリ)は分かりやすいです.

更新履歴

2017年01月09日 ページの新規作成


no counter