ざっくりん雑記

プログラミングで忘れそうなことをひたすらメモる

MySQL入門 - テーブル作成、テーブルの構造の確認方法など

前回は作業ユーザの作り方と、ユーザ一覧の参照方法を確認した。

azuuun-memorandum.hatenablog.com

今回は、実際にテーブルを作ってみる。

前々回の記事で blog_data データベースを作った。そこに users テーブルというのを追加する。

テーブルを作る

テーブルとフィールドとレコードの関係をおさらいすると…

  • テーブル
    • フィールド(テーブルの列)
    • レコード(テーブルの行)


今回はこの内容のテーブルを作ってみる

内容 ID 名前 年齢 パスワード Eメール 性別 メモ
フィールド名 id name age password email sex memo
データ型 int varchar(255) int char(32) varchar(255) enum text


各フィールドにはデータ型を設定する。 入力するデータの種類に応じて型を指定する必要がある。

例えば、

IDには int が設定されている。intは整数値を入れる型。1,2,3,4,...といったデータが入る。

name には varchar(255) が設定されている。varcharは可変長 文字列型。255文字まで入る。

password には char(32) が設定されている。charは固定長 文字列型。32文字まで入る。

sex には enum が設定されている。これは文字列定数をリストにする。実際にはenum('male','female')と設定する。ここには'male'か'female'のいずれかの一つ指定してデータを入れてあげる必要がある。

その他、いろいろデータ型は設定できる。このサイトが参考になりました。

www.dbonline.jp


実際にテーブルを作る時は、

create table users (
    id int,
    name varchar(255),
    age int,
    email varchar(255),
    password char(32),
    sex enum('male', 'female') default 'male',
    memo text
);

このような書式で書いていく。 実際に入力する際はテキストエディタに書いてからコピペでも可能。

mysql> create table users (
    ->  id int,
    ->  name varchar(255),
    ->  age int,
    ->  email varchar(255),
    ->  password char(32),
    ->  sex enum('male', 'female') default 'male',
    ->  memo text
    -> );

このような感じ。うまくいくと…

Query OK, 0 rows affected (0.03 sec)

と返ってくる。

テーブル一覧を取得する

mysql> show tables;

で表示できた。

+---------------------+
| Tables_in_blog_data |
+---------------------+
| users               |
+---------------------+

さっき作った users テーブルがあるのが確認できた。

テーブルの構造を取得する

次に users テーブルの構造を見たいとき(どんなフィールドがあって、データ型はどう設定してあるか等)

mysql> desc users;

users テーブルを確認すると…

+----------+-----------------------+------+-----+---------+-------+
| Field    | Type                  | Null | Key | Default | Extra |
+----------+-----------------------+------+-----+---------+-------+
| id       | int(11)               | YES  |     | NULL    |       |
| name     | varchar(255)          | YES  |     | NULL    |       |
| age      | int(11)               | YES  |     | NULL    |       |
| email    | varchar(255)          | YES  |     | NULL    |       |
| password | char(32)              | YES  |     | NULL    |       |
| sex      | enum('male','female') | YES  |     | male    |       |
| memo     | text                  | YES  |     | NULL    |       |
+----------+-----------------------+------+-----+---------+-------+

指定したとおりテーブルが作成されているのが確認できた。

テーブルを削除する

mysql> drop table users;

削除できたかな?

mysql> show tables;

show tablesでテーブル一覧取得

Empty set (0.00 sec)

削除できた。


今回はここまで。

MySQL入門 - 作業ユーザを作る方法とMySQLのユーザ一覧を参照する方法

前回は、データベースの作成、削除、接続中のデータベースの確認などを確認した。

azuuun-memorandum.hatenablog.com

今回は、特定のデータベースにアクセスするための作業ユーザというのを作っていく。ちなみに今までは全てrootユーザで操作していた。

作業ユーザを作る

今まで使っていたrootユーザというのは権限が強いので全てのデータベースにアクセスすることが可能。なのでrootユーザでうっかり間違った操作を行ってしまうと、全てのデータベースに影響を与えかねない。

そういう意味で、一般的にはひとつのデータベースを作ったら、そのデータベースにだけアクセス可能な"作業ユーザ"を作ってデータベースをいじっていくのが基本になる。

ではさっそく作ってみる。まずはrootでMySQLにアクセスし、新しくデータベースを作る。

mysql> create database blog_data;

blog_data に関してはデータベース名なので適当に違う名前にしても良い。自分はドットインストールを見ながらやってるので、例に近い名前を付けてみた。

次に作った blog_data データベースに対して作業ユーザを設定する。書式はこんな感じ。

grant all on データベース名.* to ユーザー名@loacalhost identified by ‘パスワード';
  • "grant all on データベース名.*" →「そのデータベースにおいて権限を与える」

  • "to ユーザ名@localhost" →「localhostの○○ユーザに対して」

  • "identified by 'パスワード'" →「パスワードを設定する」

という意味。

実際に実行すると、

mysql> grant all on blog_data.* to azuuun@localhost identified by '********';
Query OK, 0 rows affected (0.00 sec)

無事、作業ユーザができた。

作業ユーザで該当データベースにアクセスする

まず、MySQLサーバを終了させる。

コマンドプロンプトから

>mysql -u azuuun -p blog_data

パスワードを入力してアクセス。無事、作業ユーザで入れた。

MySQLのユーザを調べる

rootユーザでアクセスする。

mysql> select Host,User,Password from mysql.user;

mysql データべースの user テーブルを参照できる。

+-----------+--------+------------+
| Host      | User   | Password   |
+-----------+--------+------------+
| localhost | root   | ********** |
| 127.0.0.1 | root   | ********** |
| ::1       | root   | ********** |
| localhost | hoge   | ********** |
| localhost | azuuun | ********** |
+-----------+--------+------------+

さっき作った User 'azuuun'も確認できた。 ここにUser名が空で名前がないユーザ、通称"匿名ユーザ"が存在する場合、セキュリティを考えてパスワードを設定するか削除することが推奨されているようです。

セキュリティを考慮し、MySQLの匿名ユーザーにパスワードを設定、または削除 | VPSサーバーでWebサイト公開 備忘録 ~Linux、MySQLからAJAXまで

MySQLのユーザ―管理についてはこちらが詳しい。

www.karakaram.com

今回はここまで。

MySQL入門 - データベース作成、削除、接続データベースの確認など

前回は、コマンドプロンプトからMySQLの起動、終了、それとオプション指定の調べ方、使い方を確かめた。

azuuun-memorandum.hatenablog.com

今回は、データベースを作成して作業ユーザを設定してみる。

データベースを作る

前回やったようにまずMySQLサーバにアクセスする。 アクセスできたら、さっそく作ってみる。

mysql> create database blog_data;

うまく出来ると、

Query OK, 1 row affected (0.00 sec)

こう返ってくる。 データベースが出来ました。

データベース一覧を確認する

mysql> show databases;

注意する点は"databeses"と複数形になっているところ。うまくいくと次のように返ってくる。

+--------------------+
| Database           |
+--------------------+
| information_schema |
| blog_data          |
| mysql              |
| performance_schema |
| sakila             |
| test               |
| world              |
+--------------------+
7 rows in set (0.00 sec)

さっき作った blog_data も表示されているのが分かる。

データベースを削除する

mysql> drop database blog_data;

うまく削除できると次のように返ってくる。

Query OK, 0 rows affected (0.03 sec)

当たり前だけど、データベースを削除すると、全てのテーブルが消えるので注意。

データベースへの接続

例えば mysql というデータベースへ接続したいとき

mysql> use mysql;

こうすると、

Database changed

作業したいデータベースをチェンジできる。

現在接続しているデータベースを調べる

database関数を使って

mysql> select database();

うまくいくと次のように返ってくる。

+------------+
| database() |
+------------+
| mysql      |
+------------+
1 row in set (0.00 sec)

mysqlというデータベースに接続中だと分かる。

MySQLサーバへのアクセスと同時にデータべースを選択する

コマンドプロンプトからMySQLサーバへアクセスするとき(起動時)データベース名を指定してあげると、起動と同時に指定したデータベースに接続できる。

試しに mysql データベースに接続してみる。

> mysql -u root -p mysql

パスワードを入力して起動する。起動した時点で接続したデータベースを select database(); で調べると

+------------+
| database() |
+------------+
| mysql      |
+------------+
1 row in set (0.00 sec)

無事、mysqlデータベースに接続できていることが分かる。

今回はここまで。

MySQL入門 - コマンドプロンプトからの起動と終了とオプションの話 

前回はデータベース用語をExcelを例にして覚えるという初歩の初歩的なところをやや冗長にやった。

azuuun-memorandum.hatenablog.com

今回は、コマンドプロンプトから実際にMySQLの起動、終了、ちょっとした操作を学んでいこうと思う。

MySQLの起動

事前にMySQLのPATHは通しておいていることを前提としています。 PATHの設定はここが参考になる。

PATHの設定 - MySQLインストール

まずコマンドプロンプトを立ち上げて、MySQLサーバへの接続を試みる。

> mysql

と実行してみる。

しかし、エラーが出る。

ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)

ユーザ名やパスワードをオプションで設定せずに単に「mysql」のみでMySQLサーバへ接続しようとすると、デフォルト値を使って接続を試みようとするっぽい。

エラーを読むと

'ODBC'@'localhost'

と書いてあるけど、このODBCがデフォルトのユーザ名。 ODBClocalhostに接続しようとしたみたいだけど、アクセス拒否されてダメでしたって言ってる。

なんでアクセス拒否されてんのって感じだけど、MySQLをインストールする際に、"Anonymousユーザーは許可しません"と初期設定していたから。

パスワードはインストールの際に設定していると思うので今度はパスワードを使って接続を試みる。

> mysql -u root -p

すると、

Enter password: ****************

パスワードを求めてくるので打ち込んでEnter

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.24-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

無事、MySQLサーバに接続出来ました。

MySQLの終了

mysql > exit;

これで終了できる。(quitでも可能)

Bye

終了出来た。

オプション指定

起動するときにもオプションを指定しました。

> mysql -u root -p

この書式だと-u と -p がオプション。

どんなオプションがあるかは

> mysql -?

で一覧表示できる。

結構長い。

ちなみに起動で使った -u は

-u, --user=name     User for login if not current user.

という説明がされている。 ログインするときのユーザ名を指定するオプションと言ってる。

ちなみに -u, --user=name の2つの指定方法があるから

> mysql --user=root -p

これでも同じく起動できる。

もう一つ指定している -p は

-p, --password[=name]
                    Password to use when connecting to server. If password is
                    not given it's asked from the tty.

サーバに接続するときに使用するパスワードを指定するオプション。

今みたいな感じで色々なオプションを必要に応じて調べられる。

日本語でオプションを解説してくれてます

MySQL起動オプション解説

今回はここまで。

MySQL入門 - データベース用語を覚える

データベースシステムって何か今まで使ったことがあるだろうか…?大学のコンピュータ入門の講義でMicroSoft社の Access を少しだけ学んだことがあった。ちょっとしたアンケートデータの集計に使った。いまいちデータベースをいじってる感がなかったけど。

データベースシステムは今後扱うことになると思うので入門から少しずつ学んでいこうかと思う。この記事に書いてることは、ほぼドットインストールのMySQL入門の受け売りです。

dotinstall.com

MySQL is 何

MySQL(まい・えすきゅーえる)は、オープンソースで公開されているRDBMSの実装の一つである。現在はオラクルが支配している。
MySQL - Wikipedia

オラクルが支配している…支配…?(そこはたいしてどうでもいい)

RDBMSってなんだろう…。

RDBMS 【 Relational DataBase Management System 】とは、リレーショナルデータベースを管理するソフトウェア。リレーショナルデータベースとは、1件のデータを複数の項目(フィールド)の集合として表現し、データの集合をテーブルと呼ばれる表で表す方式で、ID番号や名前などのキーとなるデータを利用して、データの結合や抽出を容易に行うことができる。
RDBMSとは|リレーショナルデータベース管理システム|関係データベース管理システム - 意味/解説/説明/定義 : IT用語辞典

何とな~く理解した。

MySQLはいわゆるデータベースシステムのこと。

Webサービスやアプリを作るとき、ユーザのデータを格納しておく場所が必要になる。そうしたものを管理するデータベースの一つがMySQL

データベースシステム自体、いくつか種類がある。MySQLはそうしたものの中でもかなりメジャーなシステム。

MySQLのインストール方法(Windows)

ここを参考にしました。無事インストールできた。

webkaru.net

データベース用語を覚える

代表的なものに「データベース」「テーブル」「フィールド」「レコード」。 それぞれの関係はこんな感じ。

[データベース]
 * テーブル
    * フィールド
    * レコード

Webサービスやアプリを作る際に、それぞれのアプリ1つにつき「データベース」を1つ作っていく。

データベースの中にはたくさんのテーブルがあって、テーブルの中に「フィールド」と「レコード」が複数ある。

まずは、「データベース」が上位概念で、「テーブル」「フィールド」「レコード」がその下に属していることをおさえておく。

表計算ソフトをイメージするとわかりやすい

例えば、ブログサービスを開発するとき、そのアプリ1つにつき「ブログデータベース」を作る。

Excelだとすると、新規で空白のブックを作る…みたいなイメージ。

Excelで「blog_data」のブックを新規作成した。(データベースが出来たイメージ)

2つのシートを作成した。シートっていうのは画像下の「users」と「posts」のこと。

このシートをデータベースでは「テーブル」と呼ぶ。

  • usersテーブル

gyazo.com

  • postsテーブル

gyazo.com

usersテーブルでは列として「id」「name」「email」「password」を管理している。

この列のことをデータベースでは「フィールド」と呼ぶ。

blog_dataデータベースのusersテーブルには、id, name, email, passwordというフィールドがある、ということ。

そして、フィールドに対応しているデータの一つ一つを「レコード」と呼ぶ。

「usersテーブルに対して一つのレコードを挿入、もしくは一つのレコードを抽出」といった感じ。

まとめると

[データベース](Excelのブックファイル)
 * テーブル(シート)
    * フィールド(テーブルの列)
    * レコード(テーブルの行)

と覚えると良い。

今回はここまで。

Python - 辞書(dict)のkeysをリストにしてsplitした話

今日はサークルがありました。

ドットインストールの

dotinstall.com

に沿って、先輩方が丁寧に解説して教えてくれるという活動内容。ありがとうございます!

このPython入門は個人的には既に一周してるけど、二周目でも普通にやりごたえがある。たぶん一周目、寝ながらやってたんだ。眠いときって集中力以前に文章読んでも内容を全く理解できなかったりする。理解できなくて半分寝てることに気づいて「あぁ、やばいやばい…」と前項まで戻って読み返すみたいなね…。素直に寝ろって感じだ。(だいたい夜の23時あたりにこんな状態になってる)

そろそろ本題へ。

辞書のkeysをリスト化してsplitした

先日、メインブログの方でOrderedDictの使い方に関して備忘録を書いた。

azunobu.hatenablog.com

どんなプログラムを書いたかというと、

  • ある日の全国最高気温ランキングのデータを手打ちして辞書に入れた
  • 普通の辞書じゃ順序を記憶しないけどOrderedDictは記憶してくれるから気温の高い順にソート処理した(ランキングの高い順に格納)
  • そのまま出力しても見づらいのでPrettyTableを使ってASCIIテーブルを作って出力した

こんな感じ。

  • 出力したASCIIテーブル
+------------------------+------------------+
|  City                  |  AirTemperature  |
+------------------------+------------------+
|  Shitaabaru,Okinawa    |       25.8       |
|  Kuji,Iwate            |       25.7       |
|  Ishigakijima          |       25.1       |
|  Hateruma,Okinawa      |       25.0       |
|  Tokorono,Okinawa      |       24.9       |
|  Yonagunijima,Okinawa  |       24.9       |
|  Moriyama,Okinawa      |       24.9       |
|  Taneichi,Iwate        |       24.6       |
|  Nakasuji,Okinawa      |       24.4       |
|  Ohara,Okinawa         |       24.4       |
+------------------------+------------------+

Cityの要素はOrderedDictのkeysの要素で、AirTemperatureがvaluesの要素。

さらに「Shitaabaru,Okinawa」をsplitを使って ['Shitaabaru', 'Okinawa'] のように市町村と都道府県で別々のリストに分割したかった。 色々試したんだけど方法が分からずその日は諦めた。

それで、今日色々いじってたらできたので残しておく。

結果を書くとこんな感じ。本当にざっくり。

  • コード
# coding: utf-8

from collections import OrderedDict
from prettytable import PrettyTable

# 2015/5/1 9:10時点の全国気温観測値ランキングTOP10(わざとソートを崩した)
airTempValue = {'Nakasuji,Okinawa':24.4, 'Shitaabaru,Okinawa': 25.8, 'Hateruma,Okinawa': 25.0, 
    'Kuji,Iwate':25.7, 'Moriyama,Okinawa':24.9, 'Ohara,Okinawa':24.4, 'Yonagunijima,Okinawa':24.9,
    'Taneichi,Iwate':24.6, 'Ishigakijima,Okinawa':25.1, 'Tokorono,Okinawa':24.9}

airTempRanking = OrderedDict(sorted(airTempValue.items(), key = lambda x:x[1], reverse=True))

tempCityPref = airTempRanking.keys()

City = []
Pref = []
for address in tempCityPref:
    tmpList = address.split(",")
    City.append(tmpList[0])
    Pref.append(tmpList[1])
    del tmpList[:]

# ASCII TABLE CREATE

rank = range(1,11)

table = PrettyTable()
table.add_column('Rank', rank)
table.add_column('Pref', Pref)
table.add_column('City', City)
table.add_column('AirTemperature', airTempRanking.values())
table.padding_width = 2
table.align['City'] = 'l'
table.align['Pref'] = 'l'
print table
  • 結果
+--------+-----------+----------------+------------------+
|  Rank  |  Pref     |  City          |  AirTemperature  |
+--------+-----------+----------------+------------------+
|   1    |  Okinawa  |  Shitaabaru    |       25.8       |
|   2    |  Iwate    |  Kuji          |       25.7       |
|   3    |  Okinawa  |  Ishigakijima  |       25.1       |
|   4    |  Okinawa  |  Hateruma      |       25.0       |
|   5    |  Okinawa  |  Tokorono      |       24.9       |
|   6    |  Okinawa  |  Yonagunijima  |       24.9       |
|   7    |  Okinawa  |  Moriyama      |       24.9       |
|   8    |  Iwate    |  Taneichi      |       24.6       |
|   9    |  Okinawa  |  Nakasuji      |       24.4       |
|   10   |  Okinawa  |  Ohara         |       24.4       |
+--------+-----------+----------------+------------------+

辞書(dict)のkeysをリストにしてsplitする方法

上の例だと説明しづらいので新たに辞書を作ってみる。valuesの値でソートは今回はしません。

user_info = {'Tanaka,male': 1000, 'Yoshida,female': 1200,'Satou,male': 1500} 

keysには名前と性別、valueは何かのスコアだとする。

user_name_sex = user_info.keys()

keysだけ取り出してみる。

この時点で'user_name_sex'は

  • どういう属性になってるか
  • 内容はどんな感じか

確認してみる

print type(user_name_sex)
print user_name_sex
<type 'list'>
['Satou,male', 'Yoshida,female', 'Tanaka,male']

'user_name_sex'は既にリストだった。変換とかいらないんだ。

  • 辞書名.keys()で渡される要素は勝手にリストになる

当たり前か。keys()だけ取ってるのにまた辞書になるわけがないか…。

次に、

  • ['Satou,male', 'Yoshida,female', 'Tanaka,male'] を
    • nameリスト ['Satou', 'Yoshida', 'Tanaka']
    • sexリスト ['male', 'female', 'male']

の2つにsplitを使って分割(スライス)する。

name = []
sex = []
for user in user_name_sex:
    tmpList = user.split(",")
    name.append(tmpList[0])
    sex.append(tmpList[1])
    del tmpList[:]

文章で説明しづらいので、所々でprintしてみる。

name = []
sex = []
for user in user_name_sex: # ........(1)
    print user
    tmpList = user.split(",") # .....(2)
    print tmpList
    name.append(tmpList[0]) # .......(3)
    print name
    sex.append(tmpList[1]) # ........(4)
    print sex
    del tmpList[:] # ................(5)
    print tmpList
(1) Yoshida,female
(2) ['Yoshida', 'female']
(3) ['Yoshida']
(4) ['female']
(5) []
(1) Satou,male
(2) ['Satou', 'male']
(3) ['Yoshida', 'Satou']
(4) ['female', 'male']
(5) []
(1) Tanaka,male
(2) ['Tanaka', 'male']
(3) ['Yoshida', 'Satou', 'Tanaka']
(4) ['female', 'male', 'male']
(5) []

こんな流れです。

最後に、これをPrettyTableで出力すると、

+-----------+----------+---------+
|    NAME   |   SEX    |  SCORE  |
+-----------+----------+---------+
|  Yoshida  |  female  |   1200  |
|   Satou   |   male   |   1500  |
|   Tanaka  |   male   |   1000  |
+-----------+----------+---------+

こんな感じになります。

  • 全体のコード
# coding: utf-8

from prettytable import PrettyTable

user_info = {'Tanaka,male': 1000, 'Yoshida,female': 1200,'Satou,male': 1500} 

user_name_sex = user_info.keys()

name = []
sex = []
for user in user_name_sex:
    tmpList = user.split(",")
    name.append(tmpList[0])
    sex.append(tmpList[1])
    del tmpList[:]
    

# ASCII TABLE CREATE

table = PrettyTable()
table.add_column('NAME', name)
table.add_column('SEX', sex)
table.add_column('SCORE', user_info.values())
table.padding_width = 2
table.align['NAME'] = 'l'
print table

余談

ここ3日くらいPythonの辞書ばっかりやってる気がする。

正直、天気のランキング情報やユーザ情報をこんな感じで管理するのは正しいのかわからない! きっとデータベース使うんだろうな!知らんけど!MySQL勉強してみようかな?

辞書オブジェクトがどんな用途で活躍しているのかが分からないので、今後いろんなPythonソースコードを読んでみるとわかってくるかな?

Python - 辞書(ディクショナリ)の使い方

Pythonの辞書型オブジェクト

辞書型のオブジェクトの作り方は次のような感じ。

(キー1:値1, キー2:値2, ...)

辞書型は要素間に順序を持たないので、格納した順番に出力されません。キーを使って各要素を識別します。

# --- coding: utf-8 ---

dictTest = {"oneKey":1, "twoKey":2, "threeKey":3}
print dictTest

実行

{'threeKey': 3, 'twoKey': 2, 'oneKey': 1}

出力結果を見ると、順序が保たれていないことがわかります。

キーや値を取得する方法

辞書オブジェクトから

  • keyの一覧取得
  • valueの一覧取得
  • key,valueの一覧取得

を行ってみる

# --- coding: utf-8 ---


price = {'apple': 120, 'orange': 150, 'banana': 180}

# keyの一覧取得
print price.keys()

# valueの一覧取得
print price.values() 

# keyとvalueの一覧取得
print price.items()

結果

['orange', 'apple', 'banana']
[150, 120, 180]
[('orange', 150), ('apple', 120), ('banana', 180)]

ループで辞書オブジェクトを出力する方法

for文で辞書の要素と値を出力してみます。

# --- coding: utf-8 ---

price = {'apple': 120, 'orange': 150, 'banana': 180}

# forループでkeyとvalueを取得
for key, value in price.iteritems():
    print "key: %s,\t value:%d" %(key, value)

# keyのみを取得
for key in price.iterkeys():
    print "key: %s" %(key)

# valueのみを取得
for value in price.itervalues():
    print "value: %s" %(value)

結果

key: orange,     value:150
key: apple,      value:120
key: banana,     value:180
key: orange
key: apple
key: banana
value: 150
value: 120
value: 180

繰り返しになりますが、まとめてみるとこんな感じ。

  • .items() : すべてのキーと値を2つのタプルのリストで取得
  • .keys() : すべてのキーをリストで取得
  • .values() : すべての値をリストで取得

値の変更と辞書オブジェクトの長さを取得する方法

値の変更

# --- coding: utf-8 ---

price = {'apple': 120, 'orange': 150, 'banana': 180}

# price辞書のappleの値を120→130へ変更
price['apple'] = 130 
print u"値:%d" %(price['apple'])

結果

値:130

辞書オブジェクトの長さの取得

# --- coding: utf-8 ---

price = {'apple': 120, 'orange': 150, 'banana': 180}

# len関数を使用し辞書の現在持っている要素数(key数)を取得
print u"要素数:%s" % str(len(price))

結果

要素数:3

新しい要素を既存の辞書オブジェクトに追加する方法

追加

辞書名[追加したい要素のkey] = value
# --- coding: utf-8 ---

price = {'apple': 120, 'orange': 150, 'banana': 180}

# price辞書に key:kiwi,value=50 を追加
price['kiwi'] = 50 

for key, value in price.iteritems():
    print "key: %s,\t value:%d" %(key, value)

結果

key: orange,     value:150
key: kiwi,       value:50
key: apple,      value:120
key: banana,     value:180

kiwiが問題なく追加されています。

2つの辞書オブジェクトを連結(合体)させる方法

辞書オブジェクトに他の辞書を連結させることが可能です。

updateメソッドを使います。

辞書オブジェクト.update(新しく連結させたい辞書オブジェクト)
# --- coding: utf-8 ---

price = {'apple': 120, 'orange': 150, 'banana': 180}

# priceに連結させたい辞書オブジェクト
price2 = {'grape': 300, 'melon': 500, 'peach': 200}

price.update(price2)

for key, value in price.iteritems():
    print "key: %s,\t value:%d" %(key, value)

結果

key: melon,      value:500
key: grape,      value:300
key: apple,      value:120
key: peach,      value:200
key: orange,     value:150
key: banana,     value:180

注意点としては、連結させる辞書オブジェクトの要素が既存の辞書オブジェクトに既に存在する場合、追加ではなく値を上書きされます。

# --- coding: utf-8 ---

price = {'apple': 120, 'orange': 150, 'banana': 180}

# update前のprice
for key, value in price.iteritems():
    print "key: %s,\t value:%d" %(key, value)

# priceに連結させたい辞書オブジェクト
price2 = {'apple': 9999}

price.update(price2)

print "[Update Complete]"

# update後のprice
for key, value in price.iteritems():
    print "key: %s,\t value:%d" %(key, value)

結果

key: orange,     value:150
key: apple,      value:120
key: banana,     value:180
[Update Complete]
key: orange,     value:150
key: apple,      value:9999
key: banana,     value:180

price2のappleが追加ではなく、上書きされているのがわかります。

要素を削除する方法

基本的な要素の削除

del オブジェクト[要素名]
# --- coding: utf-8 ---

price = {'apple': 120, 'orange': 150, 'banana': 180}

# banana を削除
del price['banana']

for key, value in price.iteritems():
    print "key: %s,\t value:%d" %(key, value)

結果

key: orange,     value:150
key: apple,      value:120

banana要素が消えているのがわかります。

popメソッドを使ったキーの削除の方法

辞書オブジェクト.pop(要素名[,要素名2])

delメソッドと何が違うのかというと、 例えば、第1引数に削除したい要素を指定したけど、辞書オブジェクトにその要素が存在しなかったよー!って場合、 第2引数にその場合にnoneを指定してやれば、noneを返してくれる。

# --- coding: utf-8 ---

price = {'apple': 120, 'orange': 150, 'banana': 180}

value = price.pop('peach', None) 

print u"削除された要素の値:" + str(value)

結果

削除された要素の値:None

いまいち、何に使うのか分からんけど…。

辞書の中身をオールクリア

clearメソッドを使えば全ての要素を削除できます。

辞書オブジェクト.clear()
# --- coding: utf-8 ---

price = {'apple': 120, 'orange': 150, 'banana': 180}

price.clear()

print price

結果

[]

辞書自体は消されずに、空っぽの辞書オブジェクトが残るみたい。なんか儚い。

辞書型のメソッドはだいたい網羅した。