🔙
🔝

辞書を使いこなす機能一覧

教え方が下手すぎて理解できないかもしれません🙏🙏🙏

Chatpter.1 - 辞書の操作は難しい

辞書の操作は難しい

  • いきなり大きな壁を作るようなことを言ってしまいました。

  • しかし控えめに言ったとしてもやっぱり難しいんです。

  • ここだけ別世界です。

  • リストや文字列では単純に要素番号や位置番号でアクセスできました。

  • しかし辞書にはキーの2つがあり、さらにその2つをペアとした「要素」があります。

  • 要素とキーを扱うのは比較的簡単です。リストと似ています。

  • キーが持つ値にアクセスするのも簡単です。添字にキーを使えばアクセスできます。

  •   しかし値だけを使って辞書をどうこうしようとするとこれが一筋縄ではいかず、
    方法を知らずに操作しようとするとエラーメッセージのオンパレードとなること
    間違いなしです。いやホントに。

  • ネットで探しまくってもなかなか良質な情報が見つけられずに苦労した点なども含めて解説していきます。

  • のっけから沈んだ雰囲気になってしまって申し訳なし!!🤸

Chatpter.2 - メソッド

辞書特有のメソッド

  • キーと値の2種類がある為に、それぞれ分別されたメソッドもあります。

    メソッド ( ) の中身 機能
    なし キーのペアをタプルにしてリストで返す
    なし キーだけのリストを返す
    なし だけのリストを返す
    キー, 初期値 辞書にキーがあればキーの値を返し、無ければ初期値を返す
    キー, 初期値 辞書にキーがあればキーの値を返し、無ければ初期値を値に新しく要素を作って初期値を返す

    ※ 色分けした2種類、計5つに厳選しました。.update()など他にもまだいくつかあります。
.items()

.items()

  • キーのペアをタプルにしてリストで返します。

    minna_mike = {'ハルカ': '高校生', 'カナ': '中学生', 'チアキ': '小学生'}
    sisters = minna_mike.items()
    print(sisters)
    print(list(sisters))
    
    dict_items([('ハルカ', '高校生'), ('カナ', '中学生'), ('チアキ', '小学生')])
    [('ハルカ', '高校生'), ('カナ', '中学生'), ('チアキ', '小学生')]

    print()で見ると dict_items() と表示されますが、これは で使うようなイテラブルとして使うものなので、リストとしてデータを操作する場合には list() に変換する必要があります。


  • .items()は、👇こういった場面で使われます。👇

  • 文で使う

    minna_mike = {'ハルカ': '高校生', 'カナ': '中学生', 'チアキ': '小学生'}
    for name, school_level in minna_mike.items():
    	print(name, ':', school_level)
    
    ハルカ : 高校生
    カナ : 中学生
    チアキ : 小学生

    各タプルの 要素0 が name、要素1 が school_level に振り分けられます。

  • sorted()で使う

    samples = {2: 8, 1: 9, 3: 7}
    sorted_items = sorted(samples.items(), key=lambda x:(x[1], x[0]))
    print(sorted_items)
    
    [(3, 7), (2, 8), (1, 9)]

    とんでもなく難しそうなのが見えてますけど、これはソートの優先順位を「値」→「キー」にして、どちらも昇順でソートするように指示したものです。
    使い方は Chatpter.3 のsorted()で詳しく説明します。

.keys()

.keys()

  • 辞書のキーのみを、リストにして返します。

    minna_mike = {'ハルカ': '高校生', 'カナ': '中学生', 'チアキ': '小学生'}
    sisters = minna_mike.keys()
    print(sisters)
    print(list(sisters))
    
    dict_keys(['ハルカ', 'カナ', 'チアキ'])
    ['ハルカ', 'カナ', 'チアキ']

    タプルにもなっていないので、普通にリストとして使えます。

  • 文で使う

    minna_mike = {'ハルカ': '高校生', 'カナ': '中学生', 'チアキ': '小学生'}
    for name in minna_mike.keys():
    	print(name)
    
    ハルカ
    カナ
    チアキ

    一応.keys()は省略できます。

    minna_mike = {'ハルカ': '高校生', 'カナ': '中学生', 'チアキ': '小学生'}
    for name in minna_mike:
    	print(name)
    
    ハルカ
    カナ
    チアキ

    しかし、辞書のどこの部分を使っているのかを明示するためにも .keys() は付けたほうが無難です。

    .items().keys().values()を付ければ、 前に付いている変数も辞書ということがわかるようにもなります。

  • キーを用いて関数で使う

    sorted()で使うとか?

    samples = {2: 8, 1: 9, 3: 7}
    sorted_items = sorted(samples.keys())
    print(sorted_items)
    
    [1, 2, 3]
    慣れる為にも自分で打ち込んでみよう!

    キーしか使っていないので、実質リストと同じ使い方になります。
    このメソッドを使えば、リストで使える関数がそのまま使えます。

.values()

.values()

  • 辞書ののみを、リストにして返します。

    minna_mike = {'ハルカ': '高校生', 'カナ': '中学生', 'チアキ': '小学生'}
    sisters = minna_mike.values()
    print(sisters)
    print(list(sisters))
    
    dict_values(['高校生', '中学生', '小学生'])
    ['高校生', '中学生', '小学生']

    .keys()のキーが、.values()ではになっただけです。

  • 文で使う

    minna_mike = {'ハルカ': '高校生', 'カナ': '中学生', 'チアキ': '小学生'}
    for school_level in minna_mike.values():
    	print(school_level)
    
    高校生
    中学生
    小学生

    キーは不要で値のみが欲しい時に使われます。

  • を用いて関数で使う

    やっぱりsorted()で使うとか?

    samples = {2: 8, 1: 9, 3: 7}
    sorted_samples = sorted(samples.values())
    print(sorted_samples)
    
    [7, 8, 9]
    慣れる為にも自分で打ち込んでみよう!

    キーが値に変わっただけです。

  • しかし辞書の場合は「値を使って要素を並び替える」ことを必要とすることが多いです。

  • キーだけ拾ってソートする、値だけ拾ってソートするということはあまりしないかも?

  • その場合はやはり.items()を使って並び替えることになりますが、あのlambdaなんたらの使い方がわからないとできません。

  • この続きはsorted()でまた。👋

.get()

.get()

  • 辞書にキーがある時はキーの値を返します。ない時は初期値を返します。

  • 基本スタイル

    辞書[キー] = 辞書.get(キー, 初期値) + 値

  • 『辞書の中に目的のキーがあればキーの値を返し、無ければ初期値を返す』。最後に『化けた値に値を足して要素を上書き(追加)する』ということをする文です。

    赤い部分が最終的にキーの値、または初期値に化けます。

  • 流れはこんな感じです。

  • 辞書内にキーがある時

    cats = {'ミケ': 2}
    key = 'ミケ'
    cats[key] = cats.get(key, 0) + 1
    print(cats)
    
    cats = {'ミケ': 2}
    key = 'ミケ'
    cats['ミケ'] = cats.get('ミケ', 0) + 1
    print(cats)
    
    cats = {'ミケ': 2}
    key = 'ミケ'
    cats['ミケ'] = 2 + 1  # 'ミケ' の値に化けた
    print(cats)
    
    cats = {'ミケ': 2}
    key = 'ミケ'
    cats['ミケ'] = 3  # ← 値を 3 に要素を上書き
    print(cats)
    
    {'ミケ': 3}
    値を変更してみよう!

  • 辞書内にキーがない時

    cats = {'ミケ': 2}
    key = 'トラ'
    cats[key] = cats.get(key, 0) + 1
    print(cats)
    
    cats = {'ミケ': 2}
    key = 'トラ'
    cats['トラ'] = cats.get('トラ', 0) + 1  # 辞書内に'トラ'がない
    print(cats)
    
    cats = {'ミケ': 2}
    cats = {'ミケ': 2}
    key = 'トラ'
    cats['トラ'] = 0 + 1  # 初期値の 0 に化けた
    print(cats)
    
    cats = {'ミケ': 2}
    cats = {'ミケ': 2}
    key = 'トラ'
    cats['トラ'] = 1  # ← 値を 1 に要素を追加
    print(cats)
    
    {'ミケ': 2, 'トラ': 1}
    追加するキーを変更してみよう!

  • リストの中の値の出現回数をカウントする時に使えます。

    nums = [3, 0, 6, 2, 3, 0, 2, 3]
    
    cnts = {}
    for i in nums:
      cnts[i] = cnts.get(i, 0) + 1
    
    print(cnts)
    
    {3: 3, 0: 2, 6: 1, 2: 2}
    いろいろ変更してみよう!

  • 単に値を増やしたり減らしたりするだけでなく、「初期値」と「値」のところをリストにして繋げるなど工夫して使うこともあったりします。

  • どんな時でも「辞書内にキーがある時、ない時」の場面に遇ったら.get()先生の出番です。

.setdefault()

.setdefault()

  • 辞書にキーがある時はキーの値を返します。無い時は {キー: 初期値} を辞書に追加し、初期値を返します。

  • 基本スタイル

    辞書[キー] = 辞書.setdefault(キー, 初期値) + 値

  • 『辞書の中に目的のキーがあればキーの値を返し、無ければ {キー: 初期値} で新しく要素を作って初期値を返す』。最後に『化けた値に値を足して要素を上書きする』ということをする文です。

    辞書[キー] = の代入に使うと.get()と同じ結果になります。

  • .get()と異なる点は、「キーが無かったら 『その場で!{キー: 初期値}辞書に追加する」ことを、このメソッドがすることです。
    (.get()は、ただ初期値を返すだけ)

  • 流れはこんな感じです。

  • 辞書内にキーがある時

    cats = {'ミケ': 2}
    key = 'ミケ'
    cats[key] = cats.setdefault(key, 0) + 1
    print(cats)
    
    cats = {'ミケ': 2}
    key = 'ミケ'
    cats['ミケ'] = cats.setdefault('ミケ', 0) + 1
    print(cats)
    
    cats = {'ミケ': 2}
    key = 'ミケ'
    cats['ミケ'] = 2 + 1  # 'ミケ' の値に化けた
    print(cats)
    
    cats = {'ミケ': 2}
    key = 'ミケ'
    cats['ミケ'] = 3  # ← 値を 3 に要素を上書き
    print(cats)
    
    {'ミケ': 3}

  • 辞書内にキーがない時

    cats = {'ミケ': 2}
    key = 'トラ'
    cats[key] = cats.setdefault(key, 0) + 1
    print(cats)
    
    cats = {'ミケ': 2}
    key = 'トラ'
    cats['トラ'] = cats.setdefault('トラ', 0) + 1  # 辞書内に'トラ'がない
    print(cats)
    
    cats = {'ミケ': 2}
    cats = {'ミケ': 2}
    key = 'トラ'
    cats['トラ'] = cats.setdefault('トラ', 0) + 1  # {'トラ': 0} を辞書に作った
    print(cats)
    
    cats = {'ミケ': 2, 'トラ': 0}
    cats = {'ミケ': 2}
    key = 'トラ'
    cats['トラ'] = 0 + 1  # 初期値 0 に化ける
    print(cats)
    
    cats = {'ミケ': 2, 'トラ': 0}
    cats = {'ミケ': 2}
    key = 'トラ'
    cats['トラ'] = 1  # ← 値を 1 に要素を上書き
    print(cats)
    
    {'ミケ': 2, 'トラ': 1}

  • 具体的にどう使い分ければよいかというと、微妙な差なのですが、キーが辞書に無かった時、 .setdefault()このメソッドだけで新しく {キー: 値} を追加します。

  • .get()は初期値を返すのみです。

  • 繰り返し説明になりましたが、要素をその場で作ってしまうかどうかの違いだけなのです。

  • 結局のところ、要素を新しく作っても、既存の要素を使っても、値に化けたら代入処理をしないといけませんので.get()と同じ使い方になってしまいます。


  • 以下のプログラムは.get()でも紹介した、リストの中の値の出現回数をカウントするプログラムです。

  • .get()の場合

    nums = [3, 0, 6, 2, 3, 0, 2, 3]
    
    cnts = {}
    for n in nums:
        cnts[n] = cnts.get(n, 0) + 1
    
    print(cnts)
    
    {3: 3, 0: 2, 6: 1, 2: 2}

  • .setdefault()の場合

    nums = [3, 0, 6, 2, 3, 0, 2, 3]
    
    cnts = {}
    for n in nums:
        cnts.setdefault(n, 0)  # 代入しなくても要素が追加される
        cnts[n] += 1  # キーの値に 1 を足す
    
    print(cnts)
    
    {3: 3, 0: 2, 6: 1, 2: 2}

  • 無理矢理分けて書いただけであまり良い例ではありませんでしたが、あとは、

    dic = {'ミケ': 2, 'トラ': 1, 'タマ': 0}
    names = ['ミケ', 'タマ', 'うめ', 'もも']
    
    for name in names:
        if dic.setdefault(name, 0) == 0:
            dic[name] += 1
    
    print(dic)
    
    {'ミケ': 2, 'トラ': 1, 'タマ': 1, 'うめ': 1, 'もも': 1}

    辞書にキーがあり、値が 0 の時は「値に 1 を足す」。
    辞書にキーがない時は、初期値 0 でキーを作り、値が 0 なので「1 を足す」。

  • 結果、「タマ」の 0 だった値が 1 になり、
    「うめ」「もも」の 初期値 0 も 1 になりました。

  • 「その場ですぐに要素を作る」というのが特徴なので、そういったことが必要な場面に遇ったら使ってみてください。無くても困らないんだけどね~。ホントに微妙。😽

  • あとは名前からして「初期値を使って要素を新しく作る」ということがわかるので、.get()よりも明示的な意味で使うというのもアリでしょう。このメソッドを紹介したのはこの理由の為です。

Chatpter.3 - 関数

辞書で関数を使う

  • ここが最もハードルが高い所です。
  • ( ) の中身は、今回は辞書型変数.items()を入れていきます。

    関数 機能
    ターゲットの値を並び替える
    ターゲットの一番大きな(小さな)値を返す
    ターゲットの数値を合計する
  • ※ 脳内混雑を避けるため、絞りに絞っています。

  • ターゲットというのは、キーなら「キー」、値なら「値」を指します。

  • 一度で理解しようとしないで、休み休み繰り返し読んでみてください。

sorted()

sorted(引数, key=lambda・・, reverse=True)

  • 辞書.items()(キー, 値)をペアとしたタプルのリストを作成し、key=関数 に従ってソートします。

  • [(キー, 値), (キー, 値), (キー, 値), ・・]

  • 無名関数 lambda (ラムダ) でソートする

    lambda x:(x[1], x[0])
    lambda x:(-x[1], -x[0])

    ( ) 内の優先順に、昇順でソートします。

    x[0] はキー、x[1] は値。
    ( ) 内の x を -x にすると降順になります。(数値のみ)

    最初の表に記した『ターゲット』というのが、この添字部分の要素です。


  • 細かいことを言うと、key= の部分も引数です。( ) の中身は全て引数。
    ※ これについては、この先の関数を学ぶところですべてがわかるようになります。もうしばらくお待ちください。まだ知らなくても、使わなくても困らないものは全部後回し!

  • key= はオプションで、省略できます。

  • key= を省略した場合は、キーで昇順ソートした要素をタプルでまとめて、リストで返します。

  • x は、仮の変数です。でいう ij みたいなものです。

    今は何でもいいので、とりあえず x を使っておきます。

  • もし x[1] が同じ値だった時には、次に x[0] でソートします。

  • これは「もし同点(値)だったら名前順(キー)で順位を決める」という場面などで使えます。なんて理不尽な・・・。

  • 'name': point の場合、

    点が高い順なので降順でソート -x[1]
    ↓ 同点ならば
    名前順なので昇順でソート x[0]

    lambda x:(-x[1], x[0])


  • 書かれている添字は何かというと、.items() が化けた形が

    例)[('ハルカ', 90), ('カナ', 20), ('チアキ', 80)]

    となっていて、タプル内のそれぞれの要素番号を示しているものです。

  • ('ハルカ', 90) では、

    x[0] = 'ハルカ'
    x[1] = 90

    と、なります。

  • -x[1] が先に書かれているので、全ての要素を、値から優先して降順ソートをするということになります。


  • なぜ「-」が使われるのか。
    単純に関数の中だけ数値をマイナスに変換してから、昇順ソートしているのです。

    [-90, -80, -20] ← ソートの条件を -x[1] にして昇順ソート

    [90, 80, 20] ← ソート結果の出力は x[1] のまま変わらない

  • 昇順ソートになるのは、引数に reverse=True が付いていないからです。

  • sorted(引数, key=lambda・・) の使い方

    戻り値は、ソートされた後の リスト となります。


  • 値(点数)を降順、キー(名前)を昇順でソートする

    kisaragi = {'snow': 6, 'alice': 100, 'rokugou': 6}
    sorted_kisaragi = sorted(kisaragi.items(), key=lambda x:(-x[1], x[0]))
    print(sorted_kisaragi)
    
    ↓ 経過を書くのは困難なので、参考程度に😓
    kisaragi = {'snow': 6, 'alice': 100, 'rokugou': 6}
    sorted_kisaragi = sorted([('snow', 6), ('alice', 100), ('rokugou', 6)], key=lambda x:(-x[1], x[0]))
    print(sorted_kisaragi)
    
    ↓ まずは値から降順ソート
    kisaragi = {'snow': 6, 'alice': 100, 'rokugou': 6}
    sorted_kisaragi = sorted([('alice', 100), ('snow', 6), ('rokugou', 6)], key=lambda x:(-x[1], x[0]))
    print(sorted_kisaragi)
    
    ↓ 次にキーで昇順ソート
    kisaragi = {'snow': 6, 'alice': 100, 'rokugou': 6}
    sorted_kisaragi = sorted([('alice', 100), ('rokugou', 6), ('snow', 6)], key=lambda x:(-x[1], x[0]))
    print(sorted_kisaragi)
    
    kisaragi = {'snow': 6, 'alice': 100, 'rokugou': 6}
    sorted_kisaragi = [('alice', 100), ('rokugou', 6), ('snow', 6)]
    print(sorted_kisaragi)
    
    [('alice', 100), ('rokugou', 6), ('snow', 6)]

    点数が高い順、同点の時はアルファベット順でソートされました。

  • アルファベットの降順でソートしたい場合

    残念ながら文字列は -x が使えません。

    kisaragi = {'snow': 6, 'alice': 100, 'rokugou': 6}
    sorted_kisaragi = sorted(kisaragi.items(), key=lambda x:(x[1], -x[0]))
    print(sorted_kisaragi)
    
    Traceback (most recent call last):
      File "Main.py", line 2, in <module>
        sorted_kisaragi = sorted(kisaragi.items(), key=lambda x:(x[1], -x[0]))
      File "Main.py", line 2, in <lambda>
        sorted_kisaragi = sorted(kisaragi.items(), key=lambda x:(x[1], -x[0]))
    TypeError: bad operand type for unary -: 'str'
    

    いつもより怒られました。😫


  • キーが文字列の場合は reverse=True を使うだけです。

    kisaragi = {'snow': 6, 'alice': 100, 'rokugou': 6}
    sorted_kisaragi = sorted(kisaragi.items(), reverse=True)
    print(sorted_kisaragi)
    
    [('snow', 6), ('rokugou', 6), ('alice', 100)]

  • どちらも降順にしたい場合は lambda を使います。

    kisaragi = {'snow': 6, 'alice': 100, 'rokugou': 6}
    sorted_kisaragi = sorted(kisaragi.items(), key=lambda x:(x[1], x[0]), reverse=True)
    print(sorted_kisaragi)
    
    [('alice', 100), ('snow', 6), ('rokugou', 6)]

  • 値が文字列の時は、降順の部分だけ指定します。

    kisaragi = {0: 'snow', 1: 'alice', 2: 'rokugou'}
    sorted_kisaragi = sorted(kisaragi.items(), key=lambda x: x[1], reverse=True)
    print(sorted_kisaragi)
    
    [(0, 'snow'), (2, 'rokugou'), (1, 'alice')]

    どちらも昇順でソートしたものを reverse=True で逆順にしているのです。

  • コピペで構いませんので、いろいろ試してみてください!👍
  • 値がリストの場合

    kisaragi = {'snow': [6, 19], 'alice': [100, 200], 'rokugou': [6, 100]}
    sorted_kisaragi = sorted(kisaragi.items(), key=lambda x:(-x[1][0], x[1][1], x[0]))
    print(sorted_kisaragi)
    
    [('alice', [100, 200]), ('snow', [6, 19]), ('rokugou', [6, 100])]
    刮目せよ・・・💤

    ほら、ややこしい・・・。😓

    それでも結果と比べてよく見ると x[0] はキー、x[1] はリスト、x[1] のリストの各要素の添字が続いて付いているというのがわかると思います。

  • ソートの優先順や昇順・降順、値によって組み合わせ方を変えて書いていくと、思い通りの結果になるはずです。


  • sorted(辞書の変数.items(), key=lambda x: はお約束の定型文として書いて、その後のみ注目すればOKということですね。

  • あとは上のサンプルプログラムを自身で実際にいろいろ書き変えてみて、どんな風にソートされるのかを確認して慣れていってください。

  • キーがタプルの場合

    kisaragi = {('snow', 6): 19, ('alice', 100): 200, ('rokugou', 6): 100}
    sorted_kisaragi = sorted(kisaragi.items(), key=lambda x:(-x[1], -x[0][1], x[0][0]))
    print(sorted_kisaragi)
    
    [(('alice', 100), 200), (('rokugou', 6), 100), (('snow', 6), 19)]
    刮目せよ・・・💤

    「そっちもか!!」と思ったかもしれませんけど、要素番号が 値の [1] → キーの [0] になっただけで特筆すべきことはありません。


  • あとはもうホントに慣れるしかないのです。😫

  • あまりに複雑なソートが求められた場合は、辞書の構造から見直した方が良いと思います。

  • sorted()関数自体、他にも様々な使い方ができます。

  • 今回はここまでになりますが、興味がある方はネットで調べてみてください。

    (ソートのちょっとしたコツ)

  • 読んでもよくわからなかった!という場合、こうすればOK!


  • A が同じときは B、B も同じときは C、の条件順にソートする時は、

    C → B → A

    の順に、sorted().sort()を使って1つずつソートしていきます。

  • 流れはこうなります。

  • lst = sorted(dic, C)
    lst.sort(B)
    lst.sort(A)
    

  • 値がリストの場合の例の結果と比較してみます。

    [('alice', [100, 200]), ('snow', [6, 19]), ('rokugou', [6, 100])]

    A : 値のリストの 要素 0 で降順ソート -x[1][0]
    B : 値のリストの 要素 1 で昇順ソート x[1][1]
    C : キーで昇順ソート x[0]

    使うデータ

    kisaragi = {'snow': [6, 19], 'alice': [100, 200], 'rokugou': [6, 100]}
    

    1回目 C (キーで昇順ソート)
    sorted_kisaragi = sorted(kisaragi.items())
    print(sorted_kisaragi)
    
    [('alice', [100, 200]), ('rokugou', [6, 100]), ('snow', [6, 19])]

    2回目 B (値のリストの 要素 1 で昇順ソート)
    sorted_kisaragi.sort(key=lambda x:x[1][1])
    print(sorted_kisaragi)
    
    [('snow', [6, 19]), ('rokugou', [6, 100]), ('alice', [100, 200])]

    3回目 A (値のリストの 要素 0 で降順ソート)
    sorted_kisaragi.sort(key=lambda x:x[1][0], reverse=True)
    print(sorted_kisaragi)
    
    [('alice', [100, 200]), ('snow', [6, 19]), ('rokugou', [6, 100])]

    まとめると

    kisaragi = {'snow': [6, 19], 'alice': [100, 200], 'rokugou': [6, 100]}
    
    sorted_kisaragi = sorted(kisaragi.items())
    sorted_kisaragi.sort(key=lambda x:x[1][1])
    sorted_kisaragi.sort(key=lambda x:x[1][0], reverse=True)
    
    print(sorted_kisaragi)
    
    [('alice', [100, 200]), ('snow', [6, 19]), ('rokugou', [6, 100])]
    慣れる為にも自分で打ち込んでみよう!コピペでもOK!

  • このやり方にすると文字列の昇順・降順が混ざっていても、降順には -x の代わりに reverse=True を使って1項目ずつソートしていくので問題は起こりません。

  • データが少なすぎてこの例ではよくわかりませんけど😅、機会があったら試してみてください。

  • うまくいくはず・・・。(急に自信なくなってきた)

max(), min()

max(引数, key=lambda・・)

  • min()max()と使い方は同じです。

    kisaragi = {'snow': [6, 19], 'alice': [100, 200], 'rokugou': [6, 100]}
    

    kisaragi.items() の中身

    [('snow', [6, 19]), ('alice', [100, 200]), ('rokugou', [6, 100])]


    max_elem = max(kisaragi.items(), key=lambda x:x[1][1])
    print(max_elem)
    
    min_elem = min(kisaragi.items(), key=lambda x:x[1][1])
    print(min_elem)
    
    ('alice', [100, 200])最大値は 200 ('snow', [6, 19])最小値は 19

    「名前しかいらないよ~」という時は、

    max_name = max(kisaragi.items(), key=lambda x:x[1][0])[0]
    print(max_name)
    
    min_name = min(kisaragi.items(), key=lambda x:x[1][0])[0]
    print(min_name)
    
    alice最大値は 100 snow最小値が 6 で最初に見つかった要素が選ばれる
    遠慮せず、好きなようにいじくりまわしてみてください!

sum()

sum(内包表記)

  • 辞書の各ターゲットとなる要素の数値を合計します。

    kisaragi.values() の中身

    [[6, 19], [100, 200], [6, 100]]


    まずはふつうに書いてみます。

    kisaragi = {'snow': [6, 19], 'alice': [100, 200], 'rokugou': [6, 100]}
    
    elem_sum = 0
    for x in kisaragi.values():
    	elem_sum += x[0]
    
    print(elem_sum)
    
    112

    次に内包表記で書いてみます。

    kisaragi = {'snow': [6, 19], 'alice': [100, 200], 'rokugou': [6, 100]}
    elem_sum = sum(x[1] for x in kisaragi.values())
    print(elem_sum)
    
    kisaragi = {'snow': [6, 19], 'alice': [100, 200], 'rokugou': [6, 100]}
    elem_sum = sum(x[1] for x in [[6, 19], [100, 200], [6, 100]])
    print(elem_sum)
    
    kisaragi = {'snow': [6, 19], 'alice': [100, 200], 'rokugou': [6, 100]}
    elem_sum = sum(19, 200, 100)  # 要素1 のみ抽出
    print(elem_sum)
    
    kisaragi = {'snow': [6, 19], 'alice': [100, 200], 'rokugou': [6, 100]}
    elem_sum = 319
    print(elem_sum)
    
    319
    添字を 0 にすると結果が 112 になります。きっと・・・。

    kisaragi.values() の中身は、リストの要素がリストになっていて「二次元にじげんリスト」と言うのですが、タプルの時と使い方は全く同じです。

  • .keys().values()を使ってリストだけにした場合は、他の関数などでも容易に扱えます。👍
    .items()ですね、問題なのは・・・。

  • ここまで値をリストの場合として扱ってきましたが、値が数値1つの場合はいたって単純で扱いも簡単です。

  • どれだけ簡単かというと、

    kisaragi = {'snow': 19, 'alice': 200, 'rokugou': 100}
    elem_sum = sum(kisaragi.values())
    print(elem_sum)
    
    kisaragi = {'snow': 19, 'alice': 200, 'rokugou': 100}
    elem_sum = sum([19, 200, 100])
    print(elem_sum)
    
    kisaragi = {'snow': 19, 'alice': 200, 'rokugou': 100}
    elem_sum = 319
    print(elem_sum)
    
    319

    だけでいいわけですから、ゆきえちゃんらくちんらくちんです。

Chatpter.4 - in と not in も使えます

in と not in

  • リスト・タプル同様、辞書も in が使えます。

  • ただし、辞書を直接 in で探すのではなく.keys().values()を使います。

  • つまり、キーや値がリストに変換されてから、そのリストの中から目標の値を探す流れになります。

    ['snow', 'alice', 'rokugou'] .keys()

    kisaragi = {'snow': 19, 'alice': 200, 'rokugou': 100}
    name = 'alice'
    if name in kisaragi.keys():
        print(name, 'の IQ は', kisaragi[name], 'です。')
    else:
        print(name, 'は、メンバーにいません。')
    
    alice の IQ は 200 です。

    [19, 200, 100] .values()

    kisaragi = {'snow': 19, 'alice': 200, 'rokugou': 100}
    IQ = 19
    if IQ in kisaragi.values():
        print('メンバーの中にサルがいます。')
    else:
        print('メンバーは皆、戦闘員です。')
    
    メンバーの中にサルがいます。

  • .items()で要素ごと探す時は ( ) でタプルにします。

    [('snow', 19), ('alice', 200), ('rokugou', 100)] .items()

    kisaragi = {'snow': 19, 'alice': 200, 'rokugou': 100}
    name = 'rokugou'
    IQ = 100
    if (name, IQ) in kisaragi.items():
    	print(name, 'の IQ は', kisaragi[name], 'です。')
    else:
    	print(name, 'は、メンバーにいません。')
    
    rokugou の IQ は 100 です。

  • not in も同様の書き方をして使います。

    全部試してみよう!

    慣れる為にも自分で打ち込んでみよう!