Python初心者にGoogle Colabをオススメする7つの理由

Python初心者、あるいはPythonをちょっと触ってみたい!
という方は、Google Colaboratoryを使ってみることをオススメします!

この記事ではその理由について解説してみたいと思います。

Google Colaboratoryとは

https://colab.research.google.com/
Googleが提供しているクラウドで実行されるJupyter Notebook環境です。
Googleアカウントを持っていれば、誰でも無料で利用できます

Google

Python初心者にGoogle Colabを進める7つの理由

理由1: 実行環境の構築が不要

Pythonは非常に簡潔なプログラミング言語であり、プログラミング初学者にもとても向いています。

一方で、環境構築が難しくつまづく方も多いようです。

Windowsでは標準でPythonは入っておらず、Macには標準で入っているもののPython2系で(バージョンが古い)であるためです。

また、MacにプリインストールしているPythonにパッケージを追加することは、通常推奨されません。

理由2: エディタが不要

Colaboratory(正確にはJupyter Notebook)はインタラクティブな実行環境です。

つまり、エディタを用意する必要がありません。

プログラミングを嗜むようになれば、エディタにこだわりも出てくるかと思います。

しかし、初心者にとっては選択肢が多すぎて、むしろ悩ましいでしょう。

Colaboratoryを使えば、そういった手間から解放されることになります。

理由3: PCのスペックを問わない

Colaboratoryはクラウド上で実行される環境のため、基本的にはクライアントPCのスペックは低くてもOKです。

ちょっとした作業ならタブレットでも可能であり、プログラミングのハードルを下げる効果があると思います。

理由4: ドライブに保存されるため、作業場所を問わない

Colaboratoryで開発したソースコード(.ipynb)は自動でGoogleドライブに保存されます。

つまり、「家のデスクトップPCで書いたコードの続きを、カフェでノートPCで書く」といった活動をストレスなく行えます。

理由5: 共有が用意

クラウド上に保存されており、Googleドライブと連携もしているため、人への共有がとても簡単です。
(勉強会、ハンズオンなどでもよく利用されます)

また、GitHubとの連携も容易です。

理由6: インタラクティブに操作できる

ノートブック形式であるため、変数の中身やタイプを確認しながら実装を進められます。

また、セルを一つずつ実行できるので、エラーが発生した際に原因を特定しやすいです。

つまり、プログラミング初心者がつまずきやすい箇所がちょうどよくケアされています

理由7: GPUやTPUが無料で使える

機械学習(人工知能)の領域では、高速に計算を行うためにGPUやTPUと呼ばれる特殊なハードウェアを用います。

これを自前で用意すると非常に効果であるため、これらの環境が無料で使えることは大変にありがたいです。
(GPUだと数万円、TPUは実質入手不可)

機械学習がどれくらい簡単に試せるか

以前に書いた記事がありますので、コードを実行してみて下さい。(コピペで動きます)

機械学習のコードを動かしてみよう(scikit-learn)

ARC0683A 一次元リバーシ

問題

https://atcoder.jp/contests/arc063/tasks/arc063_a

方針

同色の石の連続を一塊りとして考える。

塊がいくつあるかを考え、その数から1を引けば良い。

実装のポイント

実装の際には、for文を回しながら直前の要素変数oldと比較を行い、異なっていれば答えに相当する変数ansをインクリメントする。

その際に、for文の最初で何が起きるかを考え、初期化を考える必要がある。

この実装では、BでもWでもない文字列initを与える事で、確実にインクリメントが発生するようにしている。

コード

1
2
3
4
5
6
7
8
S = input()
old = 'init'
ans = -1
for s in S:
if old!=s:
ans += 1
old = s
print (ans)

別解

ややテクニカルだが、標準ライブラリitertoolsgroupbyを用いるととてもシンプルに実装できる。groupbyで、隣接する同じ要素をイテレータとしてまとめることができるため、イテレータを数え上げることで、問題を解くことができる。

1
2
3
S = input()
g = itertools.groupby(S)
print (len(list(g)) - 1)

ARC068A Yet Another Die Game

問題

https://atcoder.jp/contests/arc068/tasks/arc068_a

方針

6の面と5の面は隣接しているため、
6→5→6→5→6…
と繰り返すのが最適であるとわかる。

そこでまず、11で整数除算を行い、2をかけることで、概算を出す。

この概算に加えて、11による剰余で以下のようなルールで補正を加える。

  • 0の場合: これ以上サイコロを振る必要がない
  • 1~6の場合: 6を出す
  • 7~10の場合: 6→5を出す

    コード

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    x = int(input())
    ans = (x // 11) * 2
    x = x % 11
    if (x==0):
    pass
    elif (x <= 6):
    ans += 1
    else:
    ans += 2
    print (ans)

BERTの理解に役立つ資料まとめ

この記事は何か

BERTを理解したいと思っている方に向けて、
そのアルゴリズムの解説ではなく参考になる資料などを紹介することで、
BERTを理解するための道しるべを提供します。

BERTとは

BERTとは2018年にGoogleが発表したNLP(自然言語処理)のモデルの一つで、
多くの自然言語処理のタスクで当時最高水準のスコアを達成しました。また、2019年にはGoogleの検索エンジンにBERTのアルゴリズムが利用されるようになりました。

「BERTによって意味理解のようなことが可能になった」と評されており注目されている技術です。

(余談ですが、関連技術の論文ではセサミストリートの名前をつける風潮があり、BERTもそこを意識しているように思います。)

構成

構成は下記の三段構成となっています。

この構成にした理由は、各トピックが比較的ですが疎な関係(前の内容をブラックボックスとしてもよい)であるためです。

  1. RNN, seq2seq, Attention付きseq2seq
  2. Transformer
  3. BERT

1. RNN, seq2seq, Attention付きseq2seq

  • 対象:ニューラルネットワークの概要を理解している
  • 到達目標:Attentionを理解している

ここでの到達目標はあくまで、Attentionを理解することです。
なぜならTransformer, BERTにはRNN構造などは用いられていないためです。
しかし、Attentionの威力を知るための道具として、seq2seqモデルはとても役に立ちます。

1-1. ゼロから作るDeep Learning2――自然言語処理編

大変評価の高い書籍です。この書籍を読む段階では完璧に理解をする必要はありません。

まずは概要を掴むことを目標とし、さらに下記の副教材を使いながら書籍を読み直したりすることで理解が深まっていくと思います。

1-2. Coursera Sequence Models

https://www.coursera.org/learn/nlp-sequence-models

Courseraで開講されている講座です。

Courseraのオンライン講座はスマホにダウンロードすることもできるので、
通勤通学時間でも学習を進めることができます。

言語は英語ですが、図や数式を豊富に使った講義であり、すでに概要を理解しているはずなので、
概ね内容を理解できると思います。

1-3. Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)

http://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/

seq2seq, Attention付きseq2seqについてアニメーション付きで解説をしている、Jay Alammar氏の記事です。

数値計算がどのように行われているか(行列の形状がどう変化するか)が視覚的に理解できます。

このサイトのその他のページにも、とても魅力的な解説があるのでぜひご参照ください。
http://jalammar.github.io/

彼のブログは、抽象的なブロックを細分化しながら理解していく解説スタイルで、最初のイメージを掴むためにとても役にたつと思います。

2. Transformer

  • 対象:Attentionを理解している
  • 到達目標:Transformerの概要を理解している

2-1. Attention is All You Need

https://arxiv.org/abs/1706.03762

Transformerが発表された論文です。

比較的読みやすく書かれた論文ですが、この内容を初見で理解するのは難しいかと思いますので、ざっと概要を読みます。

何らかの形でいつでも読み返せるようにしておくと良いです。

論文を紙で印刷して、今後の副読本の内容を読みながらメモを書き込んでいくスタイルがおすすめです。

2-2. 深層学習界の大前提Transformerの論文解説!

https://qiita.com/omiita/items/07e69aef6c156d23c538

Qiitaの記事ですが、ネットに公開されているTransformerの解説記事の中で最も分かりやすいです。

2-3. The illustrated Transformer

http://jalammar.github.io/illustrated-transformer/

先ほども紹介したJay Alammar氏のブログで、イラストが豊富な解説でとても理解がしやすいです。

2-4. 詳解ディープラーニング 第2版

TensorFlowとPyTorchのコード付きでTransformerの解説がされている貴重な一冊です。

3. BERT

  • 対象:Transformerの概要を理解している
  • 到達目標:BERTの概要を理解している

3-1. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

https://arxiv.org/abs/1810.04805

いよいよ本丸です。Transformerの時と同じで、この内容を初見で理解するのは難しいかと思いますので、ざっと概要を読むにとどめて、読み返せるようにしておくと良いです。

3-2. BERT解説:自然言語処理のための最先端言語モデル

https://ainow.ai/2019/05/21/167211/

日本語で書かれた技術メディアの記事です。論文の内容にも程よく切り込んでいます。

3-3. A Visual Guide to Using BERT for the First Time

http://jalammar.github.io/a-visual-guide-to-using-bert-for-the-first-time/

再び、Jay Alammar氏のブログです。この解説記事でもイラストが豊富です。また、scikit-learnと組み合わせたサンプルコードを交えて解説がなされており、実際に動かしながら理解することができます。

3-4. huggingface/transformers

https://github.com/huggingface

自然言語処理のモデルを集めたライブラリです。もちろんオープンソースです。

このライブラリを使うことで簡単にBERTを動かすことができますので、実際にインストールして動かしてみると良いと思います。使ってみることが理解の近道です。

TensorFlowとPyTorchに対応しています。

サンプルを動かすだけなら、使い方もそこまで難しくはないです。

3-5. BERT日本語モデル

BERTの原論文は日本語の扱いが不適切であるという指摘があります。

これらのリンクはBERTを日本語に適用する際の処方箋として役にたつと思います。

クックパッドの記事

https://techlife.cookpad.com/entry/2018/12/04/093000

京大 黒橋研のホームページ

http://nlp.ist.i.kyoto-u.ac.jp/index.php?BERT%E6%97%A5%E6%9C%AC%E8%AA%9EPretrained%E3%83%A2%E3%83%87%E3%83%AB

3-6. つくりながら学ぶ!PyTorchによる発展ディープラーニング

2020/2現在、BERTの解説がされている唯一の書籍かと思います。
書籍リストを更新しました

他のトピックの解説もあるため、この一冊でBERTが理解できる訳ではありませんが、
コードも付いており非常に貴重な解説です。

BERTに関連するページは50ページ程度。

3-7. BERT・XLNetに学ぶ、言語処理における事前学習

https://note.com/lib_arts/n/n810568c557fd

noteの有料記事です。目次にある通り、本記事のような構成で段階的にBERTを解説しています。

Reformer[2020]など、最新のモデルについても更新をされているようで、価値がある商品だと思います。

3-8. Language Learning with BERT - TensorFlow and Deep Learning Singapore

https://www.youtube.com/watch?v=0EtD5ybnh_s

BERTの概要について解説しています。

手っ取り早く使ってみたい方には良いでしょう。

単語埋め込み、LSTMあたりの概要がわかっていれば理解できると思います。

理論の詳細は掘り下げません。

3-9. [BERT] Pretranied Deep Bidirectional Transformers for Language Understanding (algorithm) | TDLS

https://www.youtube.com/watch?v=BhlOGGzC0Q0

こちらは上の動画よりは詳しい解説となっていますが、数式の説明等はありません。
図が多用されているので、アーキテクチャの理解に役立ちます。

Masked Lanuage Model(穴埋め問題)の説明が分かりやすいです。

教師なし学習(事前学習)をしたのち、fine-tuning(ファインチューニング)をして、といったように流れを掴めます。

3-10. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

https://www.youtube.com/watch?v=-9evrZnBorM

原著論文を解説しています。深く理解したい方におすすめです。

3-11 自然言語処理の王様「BERT」の論文を徹底解説

https://qiita.com/omiita/items/72998858efc19a368e50

Qiitaの記事です。論文のお供にどうぞ。

3-12 Learn BERT - most powerful NLP algorithm by Google

udemyにも講座があります。

Learn BERT - most powerful NLP algorithm by Google

まとめ

皆様がBERTの勉強をするにあたり、本記事が少しでも参考になれば幸いです。

追記

BERTを扱っている書籍(2020/3)

機械学習・深層学習による自然言語処理入門

日本語BERTで固有表現認識を行います。
BERTに関連するページは12ページ程度。

現場で使える! Python自然言語処理入門

図が豊富で分かりやすいです。
BERTに関連するページは15ページ程度。

Pythonでつくる対話システム

対話システムを作るためにBERTを利用します。
BERTに関連するページは15ページ程度。

宣伝

機械学習エンジニアを目指している方向けに、書籍を出しました。
サクッと読める内容ですので是非お手に取ってみてください。

記事情報

  • 投稿日:2020年2月11日
  • 最終更新日:2020年8月15日

【まとめ】Pythonを使ってできること7選

はじめに

この記事ではPythonを使ってどんなことができるのかをまとめます。

その前に、なぜPythonなのでしょうか。

何かの目的を達成するために、ライブラリを使わずにプログラミングすることは、
効率的ではない上に、バグを生んでしまう可能性を高めます。

つまり、目的を満たすライブラリが存在する言語を選択することが重要となります。

その点で、Pythonは言語そのものが人気であり、多くの領域で活発にライブラリが開発されているため、多くの場合であなたの目的を達成することができるでしょう。

目次

  1. 機械学習(人工知能)
  2. 科学計算
  3. Webスクレイピング
  4. Webアプリ開発
  5. 表計算

1. 機械学習(人工知能)

Pythonは機械学習や人工知能のモデルの開発に向いています。
特にDeep Learning向けのライブラリは基本的にPythonに対応しています。

  • scikit-learn
  • TensorFlow
  • PyTorch
  • Keras

2. 科学計算

最適化や信号処理といった計算に向いています。
「Pythonは計算が遅い」といった情報を聞いたことがある方もいるかもしれませんが、
Numpyなどのライブラリの内部ではC言語などの高速な言語で実装されているため、通常はあまり気にする必要はありません。

  • Scipy
  • NumPy
  • Sympy

3. Webスクレイピング

WebスクレイピングとはWebからデータを自動で抽出することをさします。
スクリプト言語であるPythonとの相性は非常に良いと思います。

  • Beautiful Soup
  • Scrapy
  • Selenium

4. Webアプリ

Webアプリ開発もできますが、特別理由がない限りあえてPythonでやる必要はないいように思います。

  • Flask
  • Django

5. 表計算

NumpyPandasは、表計算が可能な上、csvでの入出力も簡単です。エクセルなどの代替手段として、Pythonを真っ先に候補にあげて良いと思います。
Numpy, Pandas

6. データ分析

スクリプト言語であるPythonはEDA(探索的データ解析)との相性が非常によく、Jupyterなどのインタラクティブなツールと組み合わせることで、データを視覚的に確認しながら分析が可能です。

seabornはグラフ描画ライブラリmatplotlibのラッパーで、より綺麗に簡単にグラフを描画できます。

  • Numpy
  • Pandas
  • matplotlib
  • seaborn

7. プログラミング教育

Pythonは習得が比較的簡単で、最初のプログラミング言語として推奨されています。

MITなどで実績があります。

その他

セキュリティ、ネットワーク、競技プログラミングなどでも用いられるようです。

Python競プロでやりがちなミス

in listでTLE

ある集合を作成した後、ある値が集合内に含まれるか調べたい時がある。

その際に、listおよびsetの計算量はそれぞれ

1
2
Key in List #  O(n) ただし、nはlistの要素数
Key in Set # O(1)

であるので、思考停止でlistを使ってはいけない。

Pythonのsetが計算をO(1)で行えるのは、実装がハッシュテーブルであるためである。

ちなみに、listをsetに変換しようとして、

1
Set(List)

のような処理が思いつくが、この処理自体がO(n)であるので意味がない。

最大公約数・最小公倍数

1
2
3
4
# Python3.5以降
from math import gcd
# Python3.4以前
from fractions import gcd

最大公約数を求める関数を持つ標準ライブラリが、Pythonのバージョンによって異なる。

AtCoderではPython3.4.3を採用しているので、fractionsを用いる必要がある。

2020/4/13追記 Python3.8.2に更新されました

ちなみに、最小公倍数(LCM)を求める関数は実装されていないので、自前で書く必要がある。

1
2
def lcm(x, y):
return x * y * gcd(x, y)

除算は常に浮動小数点を返す

これは割り切れるかどうかに限らない。

巨大な数を扱っている場合、浮動小数点の表現の限界に達し、計算結果が正しくならない場合がある。

一旦、誤差が出てしまうと、当然その後に整数に戻しても手遅れである。

1
2
3
4
>>> int(10 ** 22 / 2)
5000000000000000000000
>>> int(10 ** 23 / 2)
49999999999999995805696

割り切れると分かっていても、// 演算子による整数除算としておくのが無難である。

この演算は整数を返す。

1
2
>>> 10**23//2
50000000000000000000000

再帰でエラー

再帰を実装すると以下のエラーに遭遇する場合がある。

1
RecursionError: maximum recursion depth exceeded in comparison

上限がデフォルトでは1000に設定されているのでこれを引き上げる。

1
2
import sys
sys.setrecursionlimit(10**9)

10**10とかにはできないので注意。

1
OverflowError: signed integer is greater than maximum

二次元リストの宣言

イディオムとして覚える。

1
2
3
4
5
6
7
8
9
# 1次元
A = [0] * 4 # OK
# 2次元
B = [[0]*4]*4 # ダメ
C = [[0]*4 for _ in range(4)] # OK

B[0][0] = 1
C[0][0] = 1
print(A,B,C)

リストのコピー

コピー元に影響を与えずに、コピーに対して操作をしたい。

多次元ならcopy.deepcopyを使う。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import copy

a = [0]
b1 = a[:] # OK
b2 = a.copy() # OK
b3 = copy.copy(a) # OK
b4 = copy.deepcopy(a) # OK
a[0] = 1
print(b1,b2,b3,b4)

a = [[0]]
b1 = a[:] # NG
b2 = a.copy() # NG
b3 = copy.copy(a) # NG
b4 = copy.deepcopy(a) # OK
a[0][0] = 1
print(b1,b2,b3,b4)

こちらの記事を参考にさせていただきました。

PythonでTLE

PyPyで提出しましょう。

競技プログラミング コンテストのお供というコンテスト最中に使うためのチートシートも作ってみたので合わせてご覧ください!

記事情報

  • 投稿日:2020年2月11日
  • 最終更新日:2020年5月21日

MNISTの使い方まとめ

概要

この記事ではMNISTデータセットの概要とそのダウンロード方法についてまとめる。

MNISTとは

「Modified National Institute of Standards and Technology database」の略称。
0~9の手書き数字文字とそのラベル(正解データ)データセットで、よく機械学習のサンプルコードの学習対象とされる。

  • 画像は学習データが60,000枚、テストデータが10,000枚で合計70,000枚
  • 各ピクセルが0~255の値を持つグレースケールの画像
  • 画像のサイズは縦横ともに28ピクセル

本家はこちら(http://yann.lecun.com/exdb/mnist/)
本家の情報では、各データセットのサイズは下記の通り。

  • train-images-idx3-ubyte.gz: training set images (9912422 bytes)
  • train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
  • t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
  • t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)

    ダウンロード方法

    主要なライブラリではとても簡単に扱えるように整備されており、
    ソースコード内でダウンロードする手段が用意されています。

Keras

1
2
3
# https://keras.io/datasets/
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

PyTorch

1
2
3
# https://pytorch.org/docs/stable/torchvision/datasets.html#mnist
from torchvision.datasets import MNIST
mnist_data = MNIST('YOUR_DIR_PATH',download=True,)

TensorFlow

1
2
3
# https://www.tensorflow.org/datasets/overview
import tensorflow_datasets as tfds
dataset = tfds.load('mnist', as_supervised=True)

scikit-learn

1
2
3
# https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_openml.html
from sklearn.datasets import fetch_openml
X, y = fetch_openml('mnist_784', return_X_y=True)

データセットの中身の確認

上述のscikit-learnでのダウンロードを選択したと仮定して、データの中身を確認してみる。

Xとyの形状を確認

1
2
3
4
>>> X.shape
(70000, 784)
>>> y.shape
(70000,)

画像はきちんと70,000枚ダウンロードできている。Xの形状をみると、2軸目が784となっており28*28の画像がflatに格納されていることがわかる。

Xの確認

1
2
3
4
5
6
7
8
>>> X
array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]])

なるほど。先頭と末尾は0ばかりのようだ。ここでは割愛するが、X[0]などを確認してみると良いだろう。

yの確認

1
2
>>> y
array(['5', '0', '4', ..., '4', '5', '6'], dtype=object)

objectとして各文字が保存されている。ラベルによって画像が
ソートされているわけではなさそうだ。
one-hot vectorに変換したい場合は以下のようにpreprocessing.LabelBinarizerを使うと良いだろう。

1
2
3
4
5
6
7
8
9
10
11
# https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelBinarizer.html
>>> from sklearn import preprocessing
>>> lb = preprocessing.LabelBinarizer()
>>> lb.fit_transform(y)
array([[0, 0, 0, ..., 0, 0, 0],
[1, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]])

データの分布

collectionsを使って、各ラベルの数え上げを行う。

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> import collections
>>> c = collections.Counter(y)
>>> c
Counter({'0': 6903,
'1': 7877,
'2': 6990,
'3': 7141,
'4': 6824,
'5': 6313,
'6': 6876,
'7': 7293,
'8': 6825,
'9': 6958})

偏りがあるようなので注意が必要だ。

まとめ

MNISTデータセットの概要とそのダウンロード方法についてまとめた。

ABC154D Dice in Line

問題

https://atcoder.jp/contests/abc154/tasks/abc154_d

方針

和の期待値 = 期待値の和であるため、

  • 各サイコロの期待値を求めて
    • (これは、1/2 * (p+1) で求まる)
  • 「サイズKの窓」をスライドさせながら、窓内にあるサイコロの期待値の和を求めることで

解を得ることができる。

ポイント

愚直に「K個のサイコロを対象とする窓」をスライドさせながら和をとる実装だと、
計算量が10^10のオーダーとなってしまい、計算が間に合わない。

そこで、窓の和を求める際に窓の中の要素を全て足すのではなく、一つ隣の窓の和との差分を計算することで、計算量を削減する。

コード

1
2
3
4
5
6
7
8
9
N, K = map(int,input().split())
P = list(map(int,input().split()))
P = [(p+1)/2 for p in P]
sm = sum(P[:K]) # 先頭のK個の和を計算
ans = sm # 最大値(答え)を保存する
for i in range(N-K):
sm = sm - P[i] + P[K+i] # 窓をずらす
ans = max(ans, sm) # 最大値(答え)を更新
print (ans)

ARC048A 階段の下

問題

https://atcoder.jp/contests/arc048/tasks/arc048_a

方針

基本的にはB-Aとすれば良い。

ポイント

単純に答えをB-Aとしてしまうと、地下一階から一階に上がる際に誤差が出る。

この誤差は AとBの符号 が異なるかで判定できる。つまり、AとBの積の符号を判定し、負であれば答えから-1を引けば良い

コード

1
2
3
4
5
a,b = map(int,input().split())
ans = b-a
if a*b<0:
ans -= 1
print (ans)

Python dictionaryの使い方まとめ

dictionaryの基本

辞書(dictionary)はマッピング型の一つです。
辞書にkeyを与えることで対応する値を返却します。

1
2
3
4
5
6
7
>>> my_dict = {'apple': 2, 'orange': 4, 'banana': 3}
>>> my_dict['apple']
2
>>> my_dict['aorange']
4
>>> my_dict['banana']
3

zipを用いて辞書を作成

辞書は2つのリストから生成することもできます。

1
2
3
4
5
>>> fruits = ['apple', 'orange', 'banana']
>>> counts = [2, 4, 3]
>>> my_dict = dict(zip(fruits, counts))
>>> my_dict
{'apple': 2, 'orange': 4, 'banana': 3}

keyのlist

1
2
>>> list(my_dict)
['apple', 'orange', 'banana']

keyが存在しない場合

1
2
>>> my_dict = {'apple': 2, 'orange': 4, 'banana': 3}
>>> my_dict['grape'] # これはエラーとなる

要素の追加

1
2
3
4
>>> my_dict = {'apple': 2, 'orange': 4, 'banana': 3}
>>> my_dict['grape'] = 1
>>> my_dict
{'apple': 2, 'orange': 4, 'banana': 3, 'grape': 1}

要素の削除

1
2
3
4
5
>>> my_dict = {'apple': 2, 'orange': 4, 'banana': 3}
>>> my_dict['grape'] = 1
>>> del my_dict['grape']
>>> my_dict
{'apple': 2, 'orange': 4, 'banana': 3}

辞書に含まれるか確認

1
2
>>> 'grape' in my_dict
False

辞書のクリア

1
2
3
4
>>> my_dict = {'apple': 2, 'orange': 4, 'banana': 3}
>>> my_dict.clear()
>>> my_dict
{}

辞書のコピー

1
2
3
4
5
>>> my_dict = {'apple': 2, 'orange': 4, 'banana': 3}
>>> my_dict_c = my_dict.copy()
>>> my_dict.clear()
>>> my_dict_c
{'apple': 2, 'orange': 4, 'banana': 3}

getによる値の取得

1
2
3
4
5
6
>>> my_dict = {'apple': 2, 'orange': 4, 'banana': 3}
>>> my_dict.get('apple')
2
>>> my_dict = {'apple': 2, 'orange': 4, 'banana': 3}
>>> my_dict.get('grape') is None
True

keyとvalueを取得

1
2
>>> my_dict.items()
dict_items([('apple', 2), ('orange', 4), ('banana', 3)])

keyの取得

1
2
>>> my_dict.keys()
dict_keys(['apple', 'orange', 'banana'])

デフォルト値の設定

1
2
3
4
5
6
7
8
9
>>> my_dict = {'apple': 2, 'orange': 4, 'banana': 3}
>>> my_dict.setdefault('grape',0)
0
>>> my_dict
{'apple': 2, 'orange': 4, 'banana': 3, 'grape': 0}
>>> my_dict.setdefault('apple',0)
2
>>> my_dict
{'apple': 2, 'orange': 4, 'banana': 3, 'grape': 0}

辞書の更新

1
2
3
4
>>> my_dict = {'apple': 2, 'orange': 4, 'banana': 3}
>>> my_dict.update({'apple': 3, 'grape': 0})
>>> my_dict
{'apple': 3, 'orange': 4, 'banana': 3, 'grape': 0}

valueの取得

1
2
3
>>> my_dict = {'apple': 2, 'orange': 4, 'banana': 3}
>>> my_dict.values()
dict_values([2, 4, 3])