python-Dictタイプ

13714 ワード

dictとは
リストとtupleは、クラスの同級生の名前など、順番の集合を表すために使用できることを知っています.
['Adam', 'Lisa', 'Bart']

または試験の成績リスト:
[95, 85, 59]

ただし,名前に応じて対応する成績を見つけるには,2つのリストで表すと不便である.
名前とスコアを関連付けると、類似のルックアップ・テーブルが構成されます.
'Adam' ==> 95
'Lisa' ==> 85
'Bart' ==> 59

名前を付けると、点数を直接調べることができます.
Pythonのdictはこのことを専門にしている.dictで「名前」-「成績」を表す検索表は以下の通りです.
d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}

私たちは名前をkeyと呼び、対応する成績をvalueと呼び、dictはkeyを通じてvalueを検索します.
カッコ{}はdictであることを示し、key:valueに従って書けばよい.最後のkey:valueのカンマは省略できます.
dictもコレクションであるため、len()関数は任意のコレクションのサイズを計算できます.
>>> len(d)
3

注意:key-valueは1つです.したがって、dictサイズは3です.
アクセスdict
名前と成績の対応関係を表すdictを作成できます.
d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}

では、どのように名前に基づいて対応する成績を探すのでしょうか.
d[key]の形式を簡単に使用して対応するvalueを検索できます.これはlistと似ています.違いは、listはインデックスを使用して対応する要素を返さなければなりませんが、dictはkeyを使用します.
>>> print d['Adam']
95
>>> print d['Paul']
Traceback (most recent call last):
  File "index.py", line 11, in 
    print d['Paul']
KeyError: 'Paul'

注意:keyによってdictのvalueにアクセスし、keyが存在する限り、dictは対応するvalueを返します.keyが存在しない場合は、keyErrorと直接エラーが発生します.
KeyErrorの発生を避けるには、次の2つの方法があります.
1つはkeyが存在するかどうかを判断し、inオペレータを使用することです.
if 'Paul' in d:
    print d['Paul']

'Paul'が存在しない場合、if文がFalseと判断した場合、print d['Paul']は自然に実行されず、エラーが回避されます.
2つ目はdict自体が提供するgetメソッドを使用し、Keyが存在しない場合にNoneを返すことです.
>>> print d.get('Bart')
59
>>> print d.get('Paul')
None

タスク#タスク#
次のdictに従います.
d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}

印刷してください:
Adam: 95
Lisa: 85
Bart: 59

コード#コード#
d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}
for key in d:
    print(key+':',d.get(key))

実行結果
Lisa: 85
Adam: 95
Bart: 59

dictの特徴
dictの最初の特徴は検索速度が速いことです.dictに10要素があっても10万要素があっても、検索速度は同じです.一方listの検索速度は要素が増加するにつれて徐々に低下する.
しかしdictの検索速度が速いのは代価がないのではなく、dictの欠点はメモリを消費するのが大きく、多くの内容を浪費することであり、listは正反対で、メモリを消費するのは小さいが、検索速度は遅い.
なぜdictの速度が速いのですか?dictはハッシュテーブルで実現されるため複雑度が低い
dictはkeyで検索されるため、1つのdictではkeyを繰り返すことはできません.
dictの2つ目の特徴は、格納されたkey-valueシーケンスペアに順序がないことです!これはリストとは異なります.
d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}

このdictを印刷しようとすると、
>>> print d
{'Lisa': 85, 'Adam': 95, 'Bart': 59}

印刷の順序は必ずしも私たちが作成した順序ではありません.また、異なる機械で印刷する順序が異なる可能性があります.これはdict内部が無秩序であり、dictで秩序のある集合を格納できないことを示しています.
dictの3つ目の特徴はkeyの要素として可変でなければならないことであり、Pythonの基本タイプ、例えば文字列、整数、浮動小数点数はいずれも可変であり、keyとして使用することができる.しかしlistは可変でありkeyとしてはならない.
listをキーとして試用したときにどのようなエラーが報告されるか試してみてください.
可変でないこの制限はkeyにのみ作用し、valueが可変かどうかは関係ありません.
{
    '123': [1, 2, 3],  # key   str,value list
    123: '123',  # key   int,value   str
    ('a', 'b'): True  # key   tuple,  tuple            ,value  boolean
}

最もよく使われるkeyは文字列です.一番使いやすいからです.
タスク#タスク#
スコアに基づいて名前を検索できるdictを設計してください.既知の成績は以下の通りです.
Adam: 95,
Lisa: 85,
Bart: 59.
コード#コード#
# -*- coding: utf-8 -*-
d={
    95:'Adam',
    85:'Lisa',
    59:'Bart'
}

dictの更新
dictは可変です.つまり、dictに新しいkey-valueをいつでも追加できます.たとえばdictがあります.
d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}

新しい同級生「Paul」の成績72を加えて、賦値文を使います.
>>> d['Paul'] = 72

dictの内容を見てみましょう.
>>> print d
{'Lisa': 85, 'Paul': 72, 'Adam': 95, 'Bart': 59}

keyがすでに存在する場合、付与値は新しいvalueで元のvalueを置き換えます.
>>> d['Bart'] = 60
>>> print d
{'Lisa': 85, 'Paul': 72, 'Adam': 95, 'Bart': 60}

遍歴dict
dictも集合であるため,遍歴dictは遍歴listと同様にforループにより実現できる.
forループを直接使用するとdictのkeyを巡回できます.
>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
>>> for key in d:
...     print key
... 
Lisa
Adam
Bart

keyにより対応するvalueを取得できるため,ループ内でvalueの値を取得できる.