🔙
🔝

辞書型

仔猫に名前を付けて愛でることができるようになります👍

Chatpter.1 - 辞書とは

辞書とは

  • {キー1: 値, キー2: 値, ・・・}

    一意いちいキー、そのキーが持つ値をペアとしたデータ構造です。😺❓

  • こんな風に書きます。

    profiles = {'一穂': 24, 'ひかげ': 16, 'れんげ': 7}
    

    '一穂': 24 で1つの要素となっています。


  • 要素とは言いますが、リストとは違って要素番号はありません。

  • 辞書の場合は要素番号の代わりに「キー」で値を扱います。そのため、

  • キーは一意でなければならず、キー重複ちょうふくを許しません。

  • 1つの辞書の中に、2つ以上の同じキーがあってはいけませんということです。

  • リストの要素番号も 0 から順に一意の番号が振られていました。それと同じです。

  • 要するに、リストでは見えなかった要素番号を見えるようにしたものが辞書のキーです。

  • その上、数値だけでなく、文字列なども使えますし、何より順番が決まっていません。

  • とても自由度が高いです。

  • リストの場合は要素番号で管理しているために、求める値がどこにあるかを把握していないとわかりませんでした。

  • 辞書の場合は、添字にキーを指定するだけで、求める値がどこにあっても見つけることができます。

  • ちょっとしたデータベースです。(じゅうぶん立派です)


  • 辞書は { } の中に キー: 値 をペアに、カンマ , で区切って入れていきます。

  • キー の間にコロン : をはさみます。

  • まだよく意味がわからないと思います。

    profiles = {'一穂': 24, 'ひかげ': 16, 'れんげ': 7}
    

    を例に説明すると、

  • '一穂' は、24 という値を持っている。

    'ひかげ' は、16 という値を持っている。

    'れんげ' は、7 という値を持っている。

  • 一応それぞれの値は年齢を指しているつもりですが、各キーから値を見てみると、

    profiles = {'一穂': 24, 'ひかげ': 16, 'れんげ': 7}
    
    sisters_age1 = profiles['一穂']  # ← 添字が独特
    sisters_age2 = profiles['ひかげ']
    sisters_age3 = profiles['れんげ']
    
    print(sisters_age1)
    print(sisters_age2)
    print(sisters_age3)
    
    24
    16
    7
    実際に見てみてください!
  • リストの要素番号が、そのままキーに置き換わっただけです。

  • 「値を見る」だけなら、添字の所をキーにするだけなので扱いは簡単かと思います。

  • それ以外のほとんどがリストとは異なりますので、リストとは別に新しく学ぶことになります。

  • 「辞書」のことを、もともとは『連想配列れんそうはいれつ』と言います。

  • Pythonでは「辞書」と言っていますが、同じものです。

  • ここでも Python流に倣って「辞書 (辞書型)」という言葉を使っていきます。

Chatpter.2 - なんで辞書を使うの?

なんで辞書を使うの?

  • こんな風に使えて便利だから!!! (リストの時の真似)

    profiles = {'一穂': 24, 'ひかげ': 16, 'れんげ': 7}
    
    for name, age in profiles.items():
        print(name + ':', age)
    
    一穂: 24
    ひかげ: 16
    れんげ: 7
    実際に見てみてください!

    .items()メソッドの機能説明は、2章の「辞書を使いこなす機能一覧」でします。

  • キー、値の片方だけでも forで利用できる!

    キーだけ

    profiles = {'一穂': 24, 'ひかげ': 16, 'れんげ': 7}
    
    for name in profiles.keys():
        print(name + ': secret')
    一穂: secret
    ひかげ: secret
    れんげ: secret
    実際に見てみてください!


    だけ

    profiles = {'一穂': 24, 'ひかげ': 16, 'れんげ': 7}
    
    for age in profiles.values():
        print('secret:', str(age) + '才')
    secret: 24才
    secret: 16才
    secret: 7才
    実際に見てみてください!
  • キーの型は統一されてなくても全然イケる!
    (こんな使い方はしませんけど)

    profiles = {'長女': '一穂', 16: 'ひかげ', ('れんげ', 7): '小学一年生'}
    
    for key, value in profiles.items():
        print(key , ':', value)
    長女 : 一穂
    16 : ひかげ
    ('れんげ', 7) : 小学一年生
    ↑ リストをキーにすることはできません。タプルはOK!
    実際に見てみてください!
  • もちろん値の変更もできる!!!

    profiles = {'一穂': 24, 'ひかげ': 16, 'れんげ': 7}
    
    for name in profiles.keys():
        profiles[name] += 1
    
    for name, age in profiles.items():
        print(name + ':', age)
    
    一穂: 25
    ひかげ: 17
    れんげ: 8
    実際に見てみてください!
  • もろちん上京要素を取り除いたりすることもできる!

    profiles = {'一穂': 24, 'ひかげ': 16, 'れんげ': 7}
    del profiles['ひかげ']
    print(profiles)
    
    {'一穂': 24, 'れんげ': 7}
    実際に見てみてください!
  • もちろん里帰り要素の追加もできる!

    profiles = {'一穂': 24, 'れんげ': 7}
    profiles['ひかげ'] = 16  # 代入っぽくキーに値を入れると辞書に追加できる
    print(profiles)
    
    {'一穂': 24, 'れんげ': 7, 'ひかげ': 16}

    ※ 並び順は要素の追加順になります。

    実際に見てみてください!
  • 初めのうちは使い慣れなくて抵抗あるかもしれません。

  • でも便利さがわかると、むしろリストのほうがめんどくさく感じるようになったりならなかったり?

Chatpter.3 - リストにできて辞書にできないこと

リストと辞書は根本から別物なので仕方がない

    1. リストと辞書の相違点

    2. 順序の有無: リストは順序を持っており、要素は順番に配置されています。
      一方で、辞書は順序が保証されていません。(※)

    3. 要素へのアクセス方法: リストでは要素番号を使用して要素にアクセスしますが、
      辞書ではキーを使用して値にアクセスします。

    4. 重複する値の扱い: リストでは同じ値の要素を複数回持つことができますが、
      辞書は同じキーの要素を複数回持つことができません。
      キーは一意でなければなりません。

    5. 変更可能性: リストは可変(mutable)であり、要素の追加、変更、削除が可能です。
      一方で、辞書も可変ですが、キーは不変(immutable)でなければなりません。

    6. リテラル表現の違い: リストは角括弧 [] を使用して表現されますが、
      辞書は波括弧 {} を使用します。

    < ChatGPT の回答を一部加筆修正 >

  • もう少し説明すると、

    1. 実はPythonは今でも進化し続けています。
      その途中で辞書にも「(※)順序の保証」が加えられました。
      これによって文でも安心して辞書の順番どおりに処理を行うことができます。
      以前は順番がめちゃめちゃで使いにくかったのです。😓
      ただし、この順序は辞書への追加順です。
    2. 要素番号がキーに置き換わっただけです。
      この理由によってリストでは勝手に各要素に順に番号が振られていたものを、辞書では自分で全ての要素に名前をつけなければなりません。それが「キー」なのです。
      逆に、名前を自分でつけられることによって値へのアクセスの自由度が生まれます。
      ちなみに、キーを数値にすると lst[0] dic[0] と、見た目が変わらなくなります。
      ただし辞書ではスライスは使えません。
    3. 平たく言うと、キーは「ID」です。同じIDが複数あってはいけません。同じ見た目の双子でも、それぞれ個人として別々の意識を持っているのと同じです。
    4. 可変・不変はタプルをやるときに説明します。
      キーは一度「これ!」と決めたら途中で何があっても変わらない変更不可能な型でないとダメですということです。〇ギとダ〇みたいなことは絶対に許されません。
    5. 意味はあるのですが、この場での説明は割愛します。

  • このような感じで決してダメな子というわけではないんです。

  • リストの [ ] と 辞書の { } は、まったくの別物なんです。

  • なので、すでにあるキーを新しく追加することはできないんです。
    (3. 重複する値の扱い)

    comics = {'にゃんにゃんびより': 1}
    comics['にゃんにゃんびより'] = 2
    print(comics)
    
    {'にゃんにゃんびより': 2}
    実際に見てみてください!

    このように値が(要素ごと)上書きされてしまいます。

  • キーは、必ず一意でなければなりません。

  • この現象によって不都合があるとすれば、

    「キーがあれば値を足す。無ければ要素を追加する。」

    これがわりとめんどくさいんです。

    もう、見るからに条件分岐してますしね。😅


  • ✅ すでにあるキーの値に足し算してみます。

    comics = {'にゃんにゃんびより': 1}
    comics['にゃんにゃんびより'] += 1
    print(comics)
    
    {'にゃんにゃんびより': 2}

    これは問題がありません。
    すでにキーがあり、その値に 1 を足すことができます。


  • 存在しないキーには値を足しようがないので、エラーになります。

    comics = {}  # 空の辞書
    comics['にゃんにゃんびより'] += 1
    print(comics)
    
    Traceback (most recent call last):
      File "Main.py", line 2, in <module>
        comics['にゃんにゃんびより'] += 1
    KeyError: 'にゃんにゃんびより'
    

    エラーメッセージがシンプルすぎますね。

    「このキーは存在しないよ」ということです。

  • 解決法は主に2つあります。


  • ✅ if文で判別する方法。

    comics = {}  # 予め空の辞書を用意しておく
    print(comics)  # 空の辞書を出力
    
    title = 'にゃんにゃんびより'
    for i in range(3):
        if title in comics:  # キーが辞書にあったら、
            comics[title] += 1  # キーが持つ値に 1 を足す
        else:
            comics[title] = 1  # 初期値 1 で要素を追加する
       
        print(comics)
    
    {}← 最初は空 {'にゃんにゃんびより': 1}if は False {'にゃんにゃんびより': 2}if は True {'にゃんにゃんびより': 3}if は True
    実際に見てみてください!


  • ✅ 難しい構文で短く書く方法。

    comics = {}  # 予め空の辞書を用意しておく
    print(comics)  # 空の辞書を出力
    
    title = 'にゃんにゃんびより'
    for i in range(3):
        comics[title] = comics.get(title, 0) + 1
       
        print(comics)
    
    {}← 最初は空 {'にゃんにゃんびより': 1}初期値 0 で新しく要素が作られて、その値に 1 を足す {'にゃんにゃんびより': 2}1 を足す {'にゃんにゃんびより': 3}1 を足す
    実際に見てみてください!

    comics.get(title, 0) + 1 が、if文の代わりです。

    comics(辞書)の中に title(キー)がなかったら、comics[title] = 0 で要素を新しく作ってそのキーの値に 1 を足し comics[title] += 1、あったらそのままそのキーの値に 1 を足す comics[title] += 1 といった具合です。

  • .get() は、辞書型のメソッドです。

    このメソッドの紹介はまた今度に。

  • あと、こんなことすらできません。

    profiles = {'一穂': 24} + {'ひかげ': 16, 'れんげ': 7}
    print(profiles)
    
    Traceback (most recent call last):
      File "Main.py", line 1, in <module>
        profiles = {'一穂': 24} + {'ひかげ': 16, 'れんげ': 7}
    TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
    

    {辞書} + {辞書} はちょっとむり。すまんぬ。

  • ✅ 辞書の接続はこうします!

    profiles = {'一穂': 24}
    profiles.update({'ひかげ': 16, 'れんげ': 7})
    print(profiles)
    
    {'一穂': 24, 'ひかげ': 16, 'れんげ': 7}
    実際に見てみてください!

    いちいちこんなことしないとくっつけられないのかと思うかもしれないけど、そもそも辞書と辞書をくっつけること自体、あんまりしないかも?

Chatpter.4 - ぼくたちは代入ができない 2期

辞書も変数のまま代入できうぇい系

  • おさらい

  • 変数2 = 変数1

    このやり方を「コピー(copy)」または「値のコピー」と言います。

  • 変数のまま 変数2変数1 を代入する(コピーする)ことが、

    できる! できない!
    str list
    int dict
    tuple set

    ※ まだ学んでいない型は細字になっています。

  • 辞書もリストと同様に、スライスで解決させたいところですが、辞書はスライスが使えません。

  • 今のところは dict() という関数がありますので、これを使いましょう。

  • dict() 関数でコピーする。

    profiles = {'一穂': 24}
    new_profs = dict(profiles)
    print(new_profs)
    
    new_profs['一穂'] = '長女'
    print(new_profs)
    print(profiles)
    
    {'一穂': 24}← コピー直後 の new_profs
    {'一穂': '長女'}← 書き換えた方の new_profs
    {'一穂': 24}← コピー元の profiles
    実際に見てみてください!

  • けど、辞書をコピーすること自体がほとんど無いかと思います。💦

  • 今回は実際に入力してみることはしませんでしたが、辞書は慣れるまで扱いがむずかしいと思います。

  • まずはキーや値をおそるおそる変えてみて、自分で書いた気になってみましょう!😸