深入python的set和dict

2021-09-24 00:08:52 字數 3666 閱讀 4066

a = ,

"2":}

# 清空字典

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",)) #

# dict.fromkeys() 函式用於建立乙個新字典,以序列 seq 中元素做字典的鍵 seq可以是可迭代的,value 為字典所有鍵對應的初始值。

my_list = [1, 2, 3]

my_new_dict = dict.fromkeys(my_list, ) #, 2: , 3: }

# setdefault() 函式和 get()方法 類似,

# 如果鍵不存在於字典中,將會新增鍵並將值設為預設值。

# 如果存在,則將會返回該key對應的value

a.setdefault("3", "cc") # a= , '2': , '3': 'cc'}

print(a.setdefault("2", "cc")) # 返回

# update() 函式把字典dict2的鍵/值對更新到dict裡。

# 如果字典b中有與a相同的key,則會把a中的key對應的value進行更新

# 如果字典b中有a中沒有的key,則a會將未有的key與value新增進去

b =

a.update(b)

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

實際情況中,我們並不提倡繼承pythonn內建型別,尤其是有c語言編寫的

class mydict(dict):

def __setitem__(self, key, value):

super().__setitem__(key, value*2)

mydict = mydict(one = 1) # 並沒有呼叫__setitem__這個魔法函式

mydict["one"] = 2 # 這種方式可以呼叫__setitem__

# 綜上結論,即使繼承了dict,如果寫法出現錯誤,也不會呼叫

如必須繼承內建型別,可以使用下面方法

from collections import userdict

class mydict(userdict):

def __setitem__(self, key, value):

super().__setitem__(key, value*2)

mydict = mydict(one = 1) # 呼叫__setitem__這個魔法函式

mydict["one"] = 2 # 這種方式也可以呼叫__setitem__

dict子類的使用

from collections import defaultdict # 這個是dict的子類

mydict = defaultdict(dict)

myvalue = mydict["bai"] # 如果不存在的話,返回{}

set 集合 無序 無重 效能很高

frozenset 不可變的集合 由於他的不可變的特點,常用於dict的key

1 >>> s.add('z')  #新增

2 >>> s

3 set(['c', 'e', 'h', 'o', 'p', 's', 'z'])

4 >>> s.update('pypi') #新增

5 >>> s

6 set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y', 'z'])

7 >>> s.remove('z') #刪除

8 >>> s

9 set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y'])

10 >>> s -= set('pypi')#刪除

11 >>> s

12 set(['c', 'e', 'h', 'o', 's'])

13 >>> del s #刪除集合

聯合( | )

1 兩個集合的聯合是乙個新集合,該集合中的每個元素都至少是其中乙個集合的成員,即,屬於兩個集合其中之一的成員。聯合符號有乙個等價的方法,union().

2 >>> s | t

3 set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])

交集( & )

1 你可以把交集操作比做集合的 and(或合取)操作。兩個集合的交集是乙個新集合,該集合中的每

2 個元素同時是兩個集合中的成員,即,屬於兩個集合的成員。交集符號有乙個等價的方法,intersection()

3 >>> s & t

4 set(['h', 's', 'o', 'p']

差補/相對補集( – )

1 兩個集合(s 和 t)的差補或相對補集是指乙個集合 c,該集合中的元素,只屬於集合 s,而不屬

2 於集合 t。差符號有乙個等價的方法,difference().

3 >>> s - t

4 set(['c', 'e'])

對稱差分( ^ )

1 和其他的布林集合操作相似, 對稱差分是集合的 xor(又稱"異或 ").

2 兩個集合(s 和 t)的對稱差分是指另外乙個集合 c,該集合中的元素,只能是屬於集合 s 或者集合 t

3 的成員,不能同時屬於兩個集合。對稱差分有乙個等價的方法,symmetric_difference().

4 >>> s ^ t

5 set(['k', 'b', 'e', 'c'])

混合集合型別操作

1 上面的示例中,左邊的 s 是可變集合,而右邊的 t 是乙個不可變集合. 注意上面使用集合操作

2 運算子所產生的仍然是可變集合,但是如果左右運算元的順序反過來,結果就不一樣了:

3 >>> t | s

4 frozenset(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])

5 >>> t ^ s

6 frozenset(['c', 'b', 'e', 'k'])

7 >>> t - s frozenset(['k', 'b'])

dict查詢的效能遠遠大於list

在list中隨著list資料的增大,查詢時間會增大

在dict中查詢元素不會隨著dict的增大而增大

dict的key或set的值 都必須是可雜湊的

不可變物件都是可雜湊的 str tuple fronzenset

如果是自定義的類,需重寫__hash__魔法函式

dict記憶體花銷大,但是查詢速度快,自定義的物件或者python內部的物件都是用dict包裝的

dict的儲存順序和元素的新增順序有關

新增資料可能改變已有資料的順序

第六章深入python的set和dict

1.collections中的abc collection是sized,iterable,container的子類 1 from collections.abc import23 45 a 6true 2.dict的常見用法 1 a 2 2 34 清空字典 5a.clear 67 淺拷貝字典 淺拷貝...

IOC和DI的聯絡

ioc是一種設計思想,而di是這種設計思想的乙個實現。理解ioc和di的關鍵是 誰依賴誰,為什麼需要依賴,誰注入誰,注入了什麼 誰依賴於誰 當然是應用程式依賴於ioc容器 為什麼需要依賴 應用程式需要ioc容器來提供物件需要的外部資源 誰注入誰 很明顯是ioc容器注入應用程式某個物件,應用程式依賴的...

python中set和frozenset方法和區別

先簡單說一下set t.add x 新增一項 s.update 10,37,42 在s中新增多項 t.remove h 刪除一項 len s set 的長度 xin s 測試 x 是否是 s 的成員 x not in s 測試 x 是否不是 s 的成員 s.issubset t s t 測試是否 s...