學習python的第三天
我又來了,今天好累,但還是得堅持學習嘛,廢話不多說,Let’s get started!
今天我們要學習的是set和dict,他們都是一組key的集合, 但他們有什么區別呢,接下來的學習會告訴我們!
首先我們來看dict
如果只是幾個人,我完全可以用list來完成這個任務
names = ['Mike', 'Bob', 'Alice']
scores = [95, 80, 85]
但全校的人數過于龐大,用list的話,list越長,耗時越長,查找起來速度較慢。
如果用dict實作,只需要一個“名字”-“成績”的對照表,直接根據名字查找成績,無論這個表有多大,查找速度都不會變慢。用Python寫一個dict如下:
>>>d = {'Mike': 95, 'Bob': 80, 'Alice': 85}
>>>d['Mike']
95為什么dict可以這么快?就拿查字典來舉例,list就是不按拼音部首直接一個字一個字的去找,而dict是按照拼音部首對應的頁碼精準查詢!
dict使用鍵-值(key-value)存盤,具有極快的查找速度。
把資料放入dict的方法,除了初始化時指定外,還可以通過key放入:
>>>d['Mike'] = 90
>>>d['Mike']
90
>>>d['Jack'] = 90
>>>d['Jack']
90
>>>d['Jack'] = 88
>>>d['Jack']
88
假設名單里沒有這位同學的名字,我們用dict去查詢會出現什么狀況呢?
>>>d['小明']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: '小明'
為了避免這種錯誤,有兩種解決辦法:
一是通過in判斷key是否存在
>>>'小明' in d
False
二是通過dict提供的get()方法,如果key不存在,可以回傳None,或者自己指定的value:
>>>d.get('小明')
>>>d.get('小明', -1)
-1如果我們不小心錯誤的添加了一個同學的資訊,由于數量較大,不方便查找,怎么辦呢?
我們可以用pop(key)來洗掉這個同學和他所對應的value
>>>d.pop('Bob‘)
80
>>>d
{'Mike': 95, 'Alice': 85}請務必注意,dict內部存放的順序和key放入的順序是沒有關系的
和list比較,dict有以下幾個特點:
1.查找和插入的速度極快,不會隨著key的增加而變慢;
2.需要占用大量的記憶體,記憶體浪費多。
而list相反
1.查找和插入的時間隨著元素的增加而增加;
2.查找和插入的時間隨著元素的增加而增加;
記住一點,dict的key必須是不可變物件,因為dict是根據key來計算value的位置,如果key的值會變,就會導致每次計算的value都不同,這樣dict的內部就混亂了。
set
>>>s = set([1, 2, 3])
>>>s
{1, 2, 3}
這里,[1,2,3]是一個list,而{1,2,3}是表示set內部的有1,2,3這三個元素。
我們可以通過add(key)來添加set中的元素,
>>>s.add(4)
>>>s
{1, 2, 3, 4}
>>>s.add(4)
>>>s
{1, 2, 3, 4}
是不是發現了什么?我們重復添加了一個4,但并沒有顯示出來,原因是set會自動過濾掉重復的元素。
通過remove(key)可以洗掉元素:
>>>s.remove(4)
>>>s
{1, 2, 3}
>>>s1 = set([1, 2, 3])
>>>s2 = set([2, 3, 4])
>>>s1 & s2
{2, 3}
>>>s1 | s2
{1, 2, 3, 4}
看到這里,我們應該清楚了,dict和set的唯一區別就是有沒有存盤對應的value。
但是,set的原理和dict一樣,所以,同樣不可以放入可變物件,因為無法判斷兩個可變物件是否相等,也就無法保證set內部“不會有重復元素”
說了這么多,到底什么是不可變物件呢?
可變物件,比如list
>>>a = ['c','b','a']
>>>a.srot()
>>>a
['a','b','c']
對于不可變物件,比如str
>>>a = 'abc'
>>>a.replace('a','A')#我們將a替換成A
'ABC'
>>>a
'abc'#what?居然沒變?
這到底是怎么回事?
讓我們用b指向'Abc'看看會怎么樣
>>> a = 'abc'
>>> b = a.replace('a', 'A')
>>> b
'Abc'
>>> a
'abc'
原來如此,當我們用replace()的時候,replace實際上是作用在字串’abc‘上,雖然replace的意思是替換,但相反,replace創建了一個新的字串’Abc‘,當我們用b來指向這個字串的時候,就容易理解了!

今天的學習就到這里,大家再見!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/186495.html
上一篇:2020雙十一領喵幣自動做任務
下一篇:2020年淘寶超級星秀貓js腳本
