參考鏈接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017104324028448
dict是字典,可以儲存鍵值對類型的值,set與dict相同,只是set只儲存key值,而不儲存value。
補充:
python中數值類型(int、float)、元組、str是不可變對象,而列表list、字典dict、集合set是可變對象
list.cout('a')查看list中'a'的個數
>>> l ['a', 2] >>> l.count('a')
List
問題:list index out of range 和 list assignment index out of range的原因
>>> a=[[],[],[1]] >>> a[0][-1]=5 Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list assignment index out of range#是再下標溢出的情況下依舊分配值的時候出現的異常 >>> a[0][-1] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range#是訪問的下標超出了list的地址 >>> a[0][1]=5 Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list assignment index out of range >>> a[0][1] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range >>>
dict
a={'sex':'nan'} >>> 'sex' in a#默認在key中檢查 True >>> 'nan' in a False >>> 'sex' in a.values() False >>> 'nan' in a.values() True >>> 'sex' in a.keys() True >>>
dict又稱map,他以鍵值對的形式儲存數據,並且為了查找方便,在存儲數據的時候,會根據key的值去計算應該放置的位置。為了保證計算位置的算法的結果不沖突,所以就要求dict數據的key值不能重復。由於這種特性,使得在查找數據時,與list的從頭開始查找相比,dict中儲存的數據查找時極快的,但是對空間有些浪費,因為常規情況下的帶儲存數據經過算法處理后,並不會無間隔的緊密的按順序放置在內存中,而是分散的。
dict內部存放的順序和key放入的順序是完全沒有關系的
dict的key必須是不可變對象,因為dict內使用hash計算key存放的位置,如果每次計算相同的key得出的結果不同,就會造成key的混亂,如果用可變對象當作key,會報錯
>>> key = [1, 2, 3] >>> d[key] = 'a list' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'
dict的一些方法和特性
一個key只能對應一個value
可以通過in判斷是否存在(只匹配key,不匹配value)
>>> l={'a':'1','b':'2'} >>> 'a' in l True >>> '1' in l False
還可以通過 get() 方法獲取指定key的內容,若key不存在,返回None,或者返回自己指定的內容
>>> l.get('a') '1' >>> l.get('1')#返回None >>> l.get('1',aaa) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'aaa' is not defined#因為必須寫“aaa” >>> l.get('1',1111) 1111 >>>
使用 pop(key) 方法刪除指定的key值
使用remove()刪除list中的index
參考鏈接:https://blog.csdn.net/u013066730/article/details/85260764
使用dict一定要注意,dict的key一定是不可變對象,在Python中,字符串、整數等都是不可變的,而list是可變的。
list與dict的區別:
兩者之間的區別主要在於查找速度和對儲存的使用率上面
1)list的查找速度會隨着存放數據的數量的增加而增加,但占用的內存小,浪費內存還小。
2)dict的查找速度極快,不會受存放數據數量大小的影響,但占用內存大,浪費空間多。
set
set 和dict類似,也是一組 key 的集合,但不儲存 value ,同樣的key不能重復。
使用一個list作為輸入創建set
>>> s=set([1,2,'a'])#注意創建時傳入的參數是一個list >>> s {1, 2, 'a'}#這樣顯示並不代表set是有序的 >>> s=set([1,2,'a','a']) >>> s {1, 2, 'a'} #不重復 >>>
使用 add(key) 添加 key 到 set 中
>>> s.add('b') >>> s.add('a')#重復添加沒有效果 >>> s {1, 2, 'a', 'b'}
使用 romove(key) 刪除
set 可以看作為數學意義上的一個集合,這個集合中的元素是無序的、是不重復的,可以做數學意義上的交集、並集操作。
>>> b=set([3,4,'d']) >>> s&b#交集 set() >>> b {'d', 3, 4} >>> s|b#並集 {1, 2, 'a', 3, 4, 'b', 'd'} >>>
不能添加可變元素,注意:tuple雖然是不可變元素,但是包含可變元素的tuble也不行
>>> b.add([5,6]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' AttributeError: 'tuple' object has no attribute 'add' >>> b.add((1,2,[3,4]))#tuple中包含了可變元素list Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' >>>
可變與不可變對象
不可變對象就是雖然看起來對他的改變會生效,是因為其返回一個新的對象。如
>>> a = 'abc' >>> b = a.replace('a', 'A') >>> b 'Abc' >>> a 'abc'
而可變對象如 list
>>> l=[1,2] >>> l [1, 2] >>> l[0]='a' >>> l ['a', 2] >>>
所以,對於不變對象來說,調用對象自身的任意方法,也不會改變該對象自身的內容。相反,這些方法會創建新的對象並返回,這樣,就保證了不可變對象本身永遠是不可變的。