Python学習ノート:DictとSet


前言
最近深く勉强して、すでにいくつかの模型を出しましたが、Pyhtonの基础がしっかりしていないので、Pythonの补习を始めました.Pythonのインストールについては、Pythonのインストールについて説明します.Pythonのインストールについては、Pythonのインストールについて説明します.Pythonのインストールについては、Pythonの実行モードと入出力については、Python IO Pythonの基本概念について説明します.PythonベースのPython文字列とコードについて説明します.これを参照してください:Python文字列と符号化Python基本データ構造:listとtupleの紹介、この編を参照してください:Python listとtuple Python制御文の紹介:ifelse、この編を参照してください:Python条件判断Python制御文の紹介:ループ実装、この編を参照してください:Pythonループ文ディレクトリ:
  • 前言
  • Dict
  • 初期化
  • 原理
  • 注意
  • tips
  • 特徴
  • Set
  • 作成
  • 特性
  • 小結
  • Dict
    Pythonには辞書:dictのサポート、dictフルネームdictionaryが内蔵されており、他の言語ではmapとも呼ばれ、キー値(key-value)を使用して格納され、データベースに相当し、検索速度が非常に速い.
    初期化
    栗を挙げると、同級生の名前に基づいて対応する成績を探すと仮定し、リストで実現するには2つのリストが必要です.
    names = ['Mike', 'Bob', 'Tracy']
    scores = [95, 75, 85]

    名前を付けて、対応する成績を検索するには、namesで対応する位置を見つけてからscoresと同じ位置から成績を取り出し、listが長ければ長いほど時間がかかります.
    dictで実現すると、「名前」-「成績」の対照表が1つ必要で、名前に基づいて成績を直接検索すると、この表がどんなに大きくても、検索速度は遅くなりません.Pythonでdictを次のように書きます.
    >>> d = {'Mike': 95, 'Bob': 75, 'Tracy': 85}
    >>> d['Mike']
    95

    げんり
    なぜdict検索速度がこんなに速いのですか?dictの実現原理は辞書を引くのと同じだからだ.仮に辞書に1万個の漢字が含まれているとしたら、ある字を調べます.1つの方法は辞書を1ページ目から後ろにひっくり返して、私たちが欲しい字を見つけるまで、リストの中で要素を探す方法です.リストが大きいほど、検索が遅くなります.
    2つ目の方法は、まず辞書のインデックス表(例えば部首表)でこの字に対応するページ番号を調べ、そのままページにめくって、この字を見つけることです.どの字を探しても、この検索速度は非常に速く、辞書の大きさが増えるにつれて遅くなることはありません.
    dictは第2の実装方式を用いており、「Mike」のような名前を付けると、dictは内部でMikeに対応する格納成績の「ページ番号」、つまり95という数字が格納されたメモリアドレスを直接計算することができ、直接取り出すことができるので、速度が非常に速い.このkey-value格納方式は、入れるときにkeyに基づいてvalueの格納位置を算出しなければならないと推測できます.そうすれば、取るときにkeyに基づいて直接valueを手に入れることができます.dictにデータを入れる方法は、初期化時に指定するほか、keyで入れることもできます.
    >>> d['Adam'] = 67
    >>> d['Adam']
    67

    に注意
    1つのkeyは1つのvalueにしか対応できないため、1つのkeyに何度もvalueを入れると、後ろの値が前の値を洗い流します.
    >>> d['Jack'] = 90
    >>> d['Jack']
    90
    >>> d['Jack'] = 88
    >>> d['Jack']
    88

    キーが存在しない場合、dictはエラーを報告します.
    >>> d['Thomas']
    Traceback (most recent call last):
      File "", line 1, in <module>
    KeyError: 'Thomas'

    tips
    keyに存在しないエラーを避けるには、inによってkeyが存在するかどうかを判断する2つの方法があります.
    >>> 'Thomas' in d
    False

    2つ目はdictによって提供されるget()メソッドで、keyが存在しない場合はNone、または自分で指定したvalueを返すことができます.
    >>> d.get('Thomas')
    >>> d.get('Thomas', -1)
    -1

    ただし、d[‘Ada’]=1で辞書を追加できます.注意:Noneに戻るとPythonのインタラクティブ環境に結果は表示されません.
    キーを削除するには、pop(key)メソッドを使用して、対応するvalueもdictから削除されます.
    >>> d.pop('Bob')
    75
    >>> d
    {'Michael': 95, 'Tracy': 85}

    dict内部に格納される順序はkeyが入れる順序とは関係ないことに注意してください.
    特長
    リストと比較すると、dictには以下のいくつかの特徴があります.
              ,    key      ;
             ,     。
    

    リストは逆です.
                      ;
         ,      。
    

    だからdictは空間で時間を取り替える方法です.
    dictは高速検索が必要な多くの場所で使用でき、Pythonコードにはほとんど存在しない.dictを正しく使用することは非常に重要であり、第一に、dictのkeyが可変オブジェクトでなければならないことを覚えておく必要がある.これはdictがkeyに基づいてvalueの格納位置を計算し,同じkeyを計算するたびに結果が異なるとdict内部が完全に混乱するためである.このkeyによって位置を計算するアルゴリズムをハッシュアルゴリズム(Hash)と呼ぶ.
    hashの正確性を保証するにはkeyの対象としては変えられない.Pythonでは文字列や整数などが可変であるため,安心してkeyとすることができる.リストは可変でありkeyとして使用できません.
    >>> key = [1, 2, 3]
    >>> d[key] = 'a list'
    Traceback (most recent call last):
      File "", line 1, in <module>
    TypeError: unhashable type: 'list'

    Set
    setはdictと同様にkeyのセットでもあるがvalueは格納されない.keyは繰り返すことができないのでsetでは繰り返すkeyはありません.
    作成
    setを作成するには、リストを入力セットとして指定する必要があります.
    >>> s = set([1, 2, 3])
    >>> s
    {1, 2, 3}

    なお、入力されたパラメータ[1,2,3]はlistであり、表示される{1,2,3}は、このset内部に1,2,3の3つの要素があることを示すだけで、表示の順序もsetが秩序していることを示さない.
    とくせい
    繰り返し要素はsetで自動的にフィルタされます.
    >>> s = set([1, 1, 2, 2, 3, 3])
    >>> s
    {1, 2, 3}

    add(key)メソッドでsetに要素を追加できます.繰り返し追加できますが、効果はありません.
    >>> s.add(4)
    >>> s
    {1, 2, 3, 4}
    >>> s.add(4)
    >>> s
    {1, 2, 3, 4}

    remove(key)メソッドで要素を削除できます.
    >>> s.remove(4)
    >>> s
    {1, 2, 3}

    setは数学的意味での無秩序と重複要素のない集合と見なすことができるため、2つのsetは数学的意味での交差、並列などの操作を行うことができる.
    >>> s1 = set([1, 2, 3])
    >>> s2 = set([2, 3, 4])
    >>> s1 & s2
    {2, 3}
    >>> s1 | s2
    {1, 2, 3, 4}
    ##

    setとdictの唯一の違いは、対応するvalueが格納されていないことだけですが、setの原理はdictと同じなので、同じように可変オブジェクトを入れることはできません.2つの可変オブジェクトが等しいかどうかを判断できないため、set内部に「重複要素がない」ことを保証することはできません.リストをsetに入れて、間違いが報告されるかどうか見てみましょう.
    s=set([[1][2]])
    Traceback (most recent call last):
      File "", line 1, in <module>
        s=set([[1][2]])
    IndexError: list index out of range

    可変オブジェクトの再検討
    strは不変オブジェクトでありlistは可変オブジェクトであると述べた.
    Listなどの可変オブジェクトに対して、listを操作すると、listの内部の内容が変わります.たとえば、次のようにします.
    >>> a = ['c', 'b', 'a']
    >>> a.sort()
    >>> a
    ['a', 'b', 'c']

    strなどの可変オブジェクトに対してstrを操作します.
    >>> a = 'abc'
    >>> a.replace('a', 'A')
    'Abc'
    >>> a
    'abc'

    文字列にはreplace()メソッドがあり、確かに「Abc」になったが、変数aは最後に「abc」である.どう理解すればいいのだろうか.
    まずコードを次のように変更します.
    >>> a = 'abc'
    >>> b = a.replace('a', 'A')
    >>> b
    'Abc'
    >>> a
    'abc'

    常に覚えておきたいのは、aは変数であり、「abc」こそ文字列オブジェクトであることです.オブジェクトaの内容は「abc」であるとよく言われますが、実際には、a自体が変数であり、アドレスが格納されている内容こそ「abc」を指します.
    ┌───┐ ┌───────┐ │ a │─────────────────>│ ‘abc’ │ └───┘ └───────┘
    a.replace(‘a’,‘A’)を呼び出すと、実際には呼び出し方法replaceは文字列オブジェクト’abc’に作用するが、この方法は名前はreplaceであるが、文字列’abc’の内容は変化しない.逆に、replaceメソッドは、新しい文字列'Abc'を作成して返します.変数bで新しい文字列を指すと、変数aは元の文字列'abc'を指していますが、変数bは新しい文字列'Abc'を指しています.
    ┌───┐ ┌───────┐ │ a │─────────────────>│ ‘abc’ │ └───┘ └───────┘ ┌───┐ ┌───────┐ │ b │─────────────────>│ ‘Abc’ │ └───┘ └───────┘
    したがって、不変オブジェクトに対しては、オブジェクト自体を呼び出す任意の方法でも、そのオブジェクト自体の内容は変更されません.逆に、これらのメソッドは新しいオブジェクトを作成して戻ります.これにより、可変オブジェクト自体が常に可変であることが保証されます.
    小結
    key-valueストレージ構造を使用するdictはPythonで非常に有用であり、keyとして可変オブジェクトを選択することが重要であり、最もよく使われるkeyは文字列である.tupleは不変の対象であるが,(1,2,3)と(1,[2,3])をdictまたはsetに入れて結果を説明してみる.