1. 程式人生 > >python3:dict常用的方法

python3:dict常用的方法

1.clear
clear的功能是對dict 的內容進行清除.沒有任何的返回值

a={"person1":{"Andy":30},"person12":{"Lady":45}}
a.clear()
print(a)

列印結果

{}

2.copy
copy 分為兩種型別 軟copy 和硬copy,又什麼區別呢, 為了
解釋清楚,我用程式碼解釋

a={"person1":{"Andy":30},"person12":{"Lady":45}}
new_a=a.copy()
print(new_a)

new_a['person1']["Andy"]=60
print(new_a)

print(a)

請看列印結果:

{'person1': {'Andy': 30}, 'person12': {'Lady': 45}}
{'person1': {'Andy': 60}, 'person12': {'Lady': 45}}
{'person1': {'Andy': 60}, 'person12': {'Lady': 45}}

軟copy是指:

我們只是修改 new_a 的value值,但是我們發現 a 的值也改變了,

原理是:它並不是複製了一份,而只是把指標指向了original的值.

有小夥伴該說了硬copy 如何實現,我們要應用copy模組的 deepcopy方法.

import copy

a={"person1":{"Andy":30},"person12":{"Lady":45}}
new_a=copy.deepcopy(a)
print(new_a)

new_a['person1']["Andy"]=60
print(new_a)

print(a)

列印結果.

{'person1': {'Andy': 30}, 'person12': {'Lady': 45}}
{'person1': {'Andy': 60}, 'person12': {'Lady': 45}}
{'person1': {'Andy': 30}, 'person12': {'Lady': 45}}

我們已經完成了 硬copy(深copy). 深copy 就是 複製一份,重新換個ID 如果操作 copy 的資料,不會影響
original的資料

3.fromkeys
請看下原始碼裡面有詳細的解釋

 @staticmethod # known case
    def fromkeys(*args, **kwargs): # real signature unknown
        """ Returns a new dict with keys from iterable and values equal to value. """
        pass

看到裝飾器應該明確這個是靜態方法, 是可以直接用類名呼叫的,

看return 描述 返回的是一個新的dict ,並且 keys 和value 對應的關係.
這樣說小夥伴一定很迷茫,老規矩上程式碼

a=["person1","person2"]

b=dict.fromkeys(a,"company")
print(b)

列印結果:

{'person1': 'company', 'person2': 'company'}

其中 company 一直會當做value, a 會當做key進行匹配.

4.get
get方法用到的地方很多,是解決key沒有對應的value 報錯的問題

例如

a={"person1":{"Andy":30},"person12":{"Lady":45}}
print(a["person"])

列印結果:

KeyError: 'person'

如果解決這個問題呢, 看下邊的程式碼:

a={"person1":{"Andy":30},"person12":{"Lady":45}}
print(a.get("person","bady"))

列印結果:

bady

如果取不到key 的值,就用後邊的預設值**“body”.**
這個是巧妙的運用,避免報錯,後邊有個方法如果不存在也可以把值匯入dict裡面.
.

5.items
這個就不用介紹了吧,咱們經常用在for迴圈裡,遍歷我們的key ,value.

6.keys

a={"person1":{"Andy":30},"person12":{"Lady":45}}
print(a.keys())

列印結果:

dict_keys(['person1', 'person12'])

7.pop,popitem
太簡單了直接上個例子就行,我也不解釋了

a={"person1":{"Andy":30},"person12":{"Lady":45}}
print(a.pop("person1"))
print(a.popitem())

列印結果

{'Andy': 30}
('person12', {'Lady': 45})

8.setdefault
實際用的人很少,熟悉的人很少,我先介紹下吧.
先看原始碼,小夥伴應該具備的素質,不懂就翻看看,裡面說明已經很清晰了

    def setdefault(self, k, d=None): # real signature unknown; restored from __doc__
        """ D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D """
        pass

通過上邊我們發現它用了get方法,並且可以set 值.這個就比較厲害了 ,我們看例子吧

1.當key 存在的情況下.

a={"person1":{"Andy":30},"person12":{"Lady":45}}
print(a.setdefault("person12"))
print(a)

列印結果:

{'Lady': 45}
{'person1': {'Andy': 30}, 'person12': {'Lady': 45}}

通過結果可以看出是返回的value值,和get 的功能一樣,

2.當key 不存在的情況下,會set值 進入dict裡面

a={"person1":{"Andy":30},"person12":{"Lady":45}}

defaut_value=a.setdefault("person3",30)
print(defaut_value)
print(a)

列印結果如下:

30
{'person1': {'Andy': 30}, 'person12': {'Lady': 45}, 'person3': 30}

30 是返回的value 值,它也會進入dict 裡面 .
9.update
下邊是我再原始碼擷取的一段話,通過這段話,
我們就很清晰知道,“E”欄位我們要求是iterable 就行,不能僅僅想到dict.
這點要注意.

 D.update([E, ]**F) -> None.  Update D from dict/iterable E and F.

這個方法目的是合併兩個iterble 型別,例子如下

a={"person1":{"Andy":30},"person12":{"Lady":45}}

b={"person6":{"Andy":40},"person20":{"Lady":80}}
print(b.update(a))
print(b)
print(a)

列印結果

None
{'person6': {'Andy': 40}, 'person20': {'Lady': 80}, 'person1': {'Andy': 30}, 'person12': {'Lady': 45}}
{'person1': {'Andy': 30}, 'person12': {'Lady': 45}}

要清晰知道
1.a.update(b)是沒有任何返回值
2.只是針對a進行update,b 不會有任何變化
3.a 會得到合併後的值.
4.a必須是個dict才能用update 方法

有小夥伴該說了,你說不僅僅只限制於dict ,那你請列出一個是不是dict例子

好吧,滿足你的好奇心.

b={"person1":{"Andy":30},"person12":{"Lady":45}}


b.update(a=1,b=2)
print(b)

列印結果:

{'person1': {'Andy': 30}, 'person12': {'Lady': 45}, 'a': 1, 'b': 2}

再送給你一個list 的型別的

b={"person1":{"Andy":30},"person12":{"Lady":45}}

a=[("maggie",20),("LIN",20)]
b.update(a)
print(b)

列印結果:

{'person1': {'Andy': 30}, 'person12': {'Lady': 45}, 'maggie': 20, 'LIN': 20}

總結:

這些方法我們要清晰知道他們如何操作的,合理利用.
認識型別的重要性 比如iterble ,不要老是想著 list,tuple,dict.

還有再次提醒要翻看原始碼,裡面寫的很詳細.