亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

PythonI/O進階學習筆記_5.python的set和dict

系統 1731 0

前言:

我一直覺得對我來說學習知識很忌諱不系統。本篇內容與上一篇 自定義序列類是有聯系的。

上一篇比較通范的了解了序列類的一些協議和特性,并且有些list的內容。這篇更加具體到set和dict這兩個序列類。

以此來了解python序列類的具體應用。(這篇比較簡單)(感覺具體比抽象都更容易理解,但是也要學會思考把具體對象抽象化來表達,即提取共性)

content:

1.dict在abc中的序列類型和繼承關系

2.dict實現了的常用方法

3.我可不可以繼承dict這種序列類?

4.set和frozenset

5.set和dict的原理

==============

?

1.dict在abc中的序列類型和繼承關系

dict在collection.abc中,實際上是屬于MutableMapping(可變mapping)類型。

PythonI/O進階學習筆記_5.python的set和dict_第1張圖片

PythonI/O進階學習筆記_5.python的set和dict_第2張圖片

跟上篇對可變序列類繼承的分析一樣,MutableMapping繼承了Mapping的一些功能并且加了一些可變的特性,

Mapping繼承了Collection。接下來的繼承和上篇的一樣。

?

2.dict實現了的常用方法

如果用的是pycharm,還是用ctrl+b就能跳到python對dict的定義。

PythonI/O進階學習筆記_5.python的set和dict_第3張圖片 PythonI/O進階學習筆記_5.python的set和dict_第4張圖片

常用:

            a = {
            
              "
            
            
              1
            
            
              "
            
            :{
            
              "
            
            
              a
            
            
              "
            
            :
            
              "
            
            
              aa
            
            
              "
            
            
              },
     
            
            
              "
            
            
              2
            
            
              "
            
            :{
            
              "
            
            
              b
            
            
              "
            
            :
            
              "
            
            
              bb
            
            
              "
            
            
              }}


            
            
              #
            
            
               清空字典
            
            
              a.clear()


            
            
              #
            
            
               淺拷貝字典 淺拷貝雖然可以正常賦值,但是如果 my_dopy_dict 中的值進行了改變,則 a 中的值也會進行對應的改變
            
            
my_dopy_dict =
            
               a.copy()


            
            
              #
            
            
               深拷貝 深拷貝則是實實在在的在內存當中聲明了一個新的變量
            
            
              import
            
            
               copy
new_dict 
            
            =
            
               copy.deepcopy(a)


            
            
              #
            
            
               get函數 dict.get(要查找的key,如果沒找到對應key的內容返回的數據)
            
            
              print
            
            (a.get(
            
              "
            
            
              3
            
            
              "
            
            ,{1:
            
              "
            
            
              3
            
            
              "
            
            })) 
            
              #
            
            
               {1: '3'}
            
            
              #
            
            
               dict.fromkeys() 函數用于創建一個新字典,以序列 seq 中元素做字典的鍵 seq可以是可迭代的,value 為字典所有鍵對應的初始值。
            
            
my_list = [1, 2, 3
            
              ]
my_new_dict 
            
            = dict.fromkeys(my_list, {
            
              "
            
            
              222
            
            
              "
            
            :
            
              "
            
            
              3434
            
            
              "
            
            }) 
            
              #
            
            
              {1: {'222': '3434'}, 2: {'222': '3434'}, 3: {'222': '3434'}}
            
            
              #
            
            
               setdefault() 函數和 get()方法 類似,
            
            
              
#
            
            
               如果鍵不存在于字典中,將會添加鍵并將值設為默認值。
            
            
              
#
            
            
               如果存在,則將會返回該key對應的value
            
            
a.setdefault(
            
              "
            
            
              3
            
            
              "
            
            , 
            
              "
            
            
              cc
            
            
              "
            
            ) 
            
              #
            
            
               a= {'1': {'a': 'aa'}, '2': {'b': 'bb'}, '3': 'cc'}
            
            
              print
            
            (a.setdefault(
            
              "
            
            
              2
            
            
              "
            
            , 
            
              "
            
            
              cc
            
            
              "
            
            )) 
            
              #
            
            
               返回{'b': 'bb'}
            
            
              #
            
            
               update() 函數把字典dict2的鍵/值對更新到dict里。
            
            
              
#
            
            
               如果字典b中有與a相同的key,則會把a中的key對應的value進行更新
            
            
              
#
            
            
               如果字典b中有a中沒有的key,則a會將未有的key與value添加進去
            
            
b = {
            
              "
            
            
              3
            
            
              "
            
            : 
            
              "
            
            
              cc
            
            
              "
            
            , 
            
              "
            
            
              2
            
            
              "
            
            : 
            
              "
            
            
              dd
            
            
              "
            
            
              }
a.update(b)

            
            
              print
            
            (a) 
            
              #
            
            
               {'1': {'a': 'aa'}, '2': 'dd', '3': 'cc'}
            
          

?

3.我可不可以繼承dict這種序列類?(dict的子類)

a.如果我偷懶想實現dict這種類型,能不能直接繼承這種序列類呢?同理list是否可以?

例:繼承dict,并且重寫設置dict key的value時調用的魔法函數,使其值變為2倍

            
              class
            
            
               Mydict(dict):
    
            
            
              def
            
            
              __setitem__
            
            
              (self, key, value):
        super().
            
            
              __setitem__
            
            (key, value*2
            
              )

a
            
            =Mydict(b=1
            
              )

            
            
              print
            
            
              (a)

a[
            
            
              '
            
            
              b
            
            
              '
            
            ]=1

            
              print
            
            (a)
          

輸出:

PythonI/O進階學習筆記_5.python的set和dict_第5張圖片

可以發現,原來同樣功能和效果的,我們重寫方法后,第一種方法去設置key的value值這一操作并沒有調用我們重寫的方法。

所以并不建議去繼承python的這種序列類。

?

b.有沒有什么辦法我實在想繼承?

python里專門給了個UserDict類,可以實現想要的繼承Dict類的效果

            
              from
            
             collections 
            
              import
            
            
               UserDict

            
            
              class
            
            
               Mydict(UserDict):
    
            
            
              def
            
            
              __setitem__
            
            
              (self, key, value):
        super().
            
            
              __setitem__
            
            (key, value*2
            
              )

mydict 
            
            = Mydict(one = 1) 
            
              #
            
            
               {'one': 2} 調用__setitem__這個魔法函數
            
            
mydict[
            
              "
            
            
              one
            
            
              "
            
            ] = 2 
            
              #
            
            
               {'one': 4} 這種方式也可以調用__setitem__
            
          

輸出:

PythonI/O進階學習筆記_5.python的set和dict_第6張圖片

?

?c.python中Dcit實際也有子類實現:defaultdict

PythonI/O進階學習筆記_5.python的set和dict_第7張圖片

使用:

            
              from
            
             collections 
            
              import
            
             defaultdict 
            
              #
            
            
               這個是dict的子類
            
            
mydict =
            
               defaultdict(dict)
myvalue 
            
            = mydict[
            
              "
            
            
              bai
            
            
              "
            
            ] 
            
              #
            
            
               如果不存在的話,返回{}
            
          

輸出:

?

4.set和frozenset

a.兩者是啥有啥特點?

set:集合(無序,不重復,可變)

frozenset:不可變集合(無序,不重復,不可變)

frozenset沒有改變的方法 一旦初始化了 就不可變了。其中,不可變類型對可變類型的一個特點,不可變類型是可以作為dict的key的。
?
b.set常用操作
              a=set(
              
                '
              
              
                abcdee
              
              
                '
              
              
                )
a.add(
              
              
                '
              
              
                f
              
              
                '
              
              
                )

              
              
                print
              
              
                (a)
another_set
              
              =set(
              
                '
              
              
                defgh
              
              
                '
              
              
                )

              
              
                #
              
              
                添加數據
              
              
                
#
              
              
                a.update(another_set)
              
              
                
#
              
              
                print(a)
              
              
                
#
              
              
                集合的差集
              
              
re_set=
              
                a.difference(another_set)

              
              
                #
              
              
                減法實現于__ior__魔法函數
              
              
re_set2=a-
              
                another_set

              
              
                #
              
              
                集合的交集&
              
              
re_set3=a&
              
                another_set

              
              
                #
              
              
                集合的并集|
              
              
re_set4=a|
              
                another_set

              
              
                print
              
              
                (re_set)

              
              
                print
              
              
                (re_set2)

              
              
                print
              
              
                (re_set3)

              
              
                print
              
              
                (re_set4)

              
              
                #
              
              
                也可以用if in判斷(實現于__contains__魔法函數)
              
              
                if
              
              
                '
              
              
                a
              
              
                '
              
              
                in
              
              
                 re_set:
    
              
              
                print
              
              (
              
                '
              
              
                I am a set
              
              
                '
              
              )
            

?

5.set和dict的原理

之前就提過,set的性能棒的。dict的查詢性能遠比起list要好。

并且list中隨著list數據的增大,查找時間會增大,而dict不會。

這是為什么呢?

因為dict使用hash這種數據結構存儲。set也是。

a.dict的散列表

PythonI/O進階學習筆記_5.python的set和dict_第8張圖片

特點:

- dict的key必須是可hash的,不可hash的是不能當成dict的key的,比如list
- python申請內存的時候,會初始化一個小的連續的空空間
- 由上一條可得這樣 一定會存在浪費,這時候每次變動操作 會計算剩余空間,剩余空間小于1/3的時候,會重新生成空間并且將現在數據都拷貝過去(rehash)
- 數組比這種鏈表結構好的地方,就是可以直接根據偏移量來存取,而不用全部開始從頭遍歷。
(這種結構hash和重hash的策略用在很多地方,包括redis等)
?
b.存儲結構了解了,那么數據的查找過程呢?
PythonI/O進階學習筆記_5.python的set和dict_第9張圖片

先計算a的散列值,查找表源是否為空,

因為a是不變的,所以如果表源為空,那么就會拋出key error。

如果表源不為空,也有可能是其他key,查看key是否是要查找的key。

如果是其他key,重新散列循環查找。

?

c.這種hash結構在ptthon中的特點

-?我們可以用__hash__這個魔法函數實現可hash對象

?- dict內存開銷比較大,這是hash表的特點。

- 實際上python內部類和對象,都是dict。

- dict存儲順序和元素添加順序有關。

- 插入數據后檢查剩余空間引發的重hash,會影響原來的數據(比如地址)。

?


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚州一级毛片 | 黄色影院网站 | 成人国产第一区在线观看 | 久久福利小视频 | 99免费在线播放99久久免费 | 国产高清美女一级a毛片久久w | 国产成人精品高清在线观看99 | 精品成人毛片一区二区视 | 91视频最新地址 | 久操热| 涩涩www在线观看免费高清 | 日韩国产精品99久久久久久 | 中文字幕不卡在线播放 | 91在线视频在线观看 | 久久婷婷人人澡人人爱91 | 欧美日韩高清观看一区二区 | 成人短视频在线 | 日本最猛黑人xxxx猛交 | 九九九九精品视频在线播放 | 亚洲成a人v在线观看 | 欧美综合图片 | a免费在线观看视频 | 欧美精品99| 亚洲日韩精品欧美一区二区一 | 簧片在线播放 | 亚洲精品tv久久久久 | 在线亚洲国产精品区 | 99久久精品免费看国产情侣 | 日本免费一区二区三区毛片 | 看欧美的一级毛片 | 久久婷婷激情 | 四虎精品免费久久 | 91在线亚洲综合在线 | 这里只有精品国产 | 色综合日本| 99成人在线视频 | 天天干天天舔天天操 | 国产精品亚洲欧美大片在线看 | 尤物视频在线免费观看 | 日韩在线一区二区三区视频 | 狠狠色噜噜狠狠狠狠2021天天 |