此次主要說說字典和集合這兩種數據類型。python
字典和集合都是基於散列表實現的,散列表也就是hash表,瞭解過數據結構的應該知道。與散列表相關的一個概念叫作可散列,什麼是可散列?在python官方定義中是這樣說的:若是一個對象是可散列的,那麼在這個對象的生命週期中,它的散列值是不變的,並且這個對象須要實現__hash__()方法。數據結構
python中,原子不可變類型(str、bytes和數值類型)都是可散列類型,同時全部的不可變類型也是可散列的。機器學習
什麼是集合?在數學中指的是具備某種特定性質的事物的整體,在python中集合指許多惟一對象的彙集。注意這個惟一,也就是說集合中不容許重複值出現,因此集合能夠用來去重。學習
在python中,用大括號括起來表示一個集合。spa
data = [11, 11, 2, 3, 4, 4, 5, 4, 6] set(data)
{2, 3, 4, 5, 6, 11}
將列表類型的data轉換爲集合類型後,重複值被去掉了。設計
在數學中,集合能夠求並集、交集、差集等,python也能夠作一樣的事。好比:code
data1 = {1, 2, 3, 4, 5} data2 = {3, 4, 5, 6, 7} # 交集 print(data1 & data2) # 差集 print(data1 - data2) # 並集 print(data1 | data2)
{3, 4, 5} {1, 2} {1, 2, 3, 4, 5, 6, 7}
上面說過,集合類型用大括號表示,若是我須要建立一個空集合,是否是用{ }
表示就好了?問題來了,空集合用{ }
表示,空字典也用{ }
表示,這確定不行。python中,建立一個空集合使用set()生成,{ }
只會建立一個空的字典。對象
還有一個要提到的是集合推導。和列表推導、字典推導相似,這裏就不講了。接口
字典中有幾個方法須要說一下,看個例子。生命週期
a = {'x': 1, 'y': 2, 'z': 3} # a.keys()返回全部鍵的集合,a.items()返回鍵值對集合,a.values返回值集合 # 可對字典進行集合運算,比較大小等運算 b = {'w' : 10,'x' : 11,'y' : 2} # 直接進行集合操做,a.values()不能夠 print(a.keys() & b.keys()) print(a.items() & b.items()) print(a.keys() - b.keys())
{'x', 'y'} {('y', 2)} {'z'}
在字典中,可使用a.keys()返回全部鍵的集合,a.items()返回鍵值對集合,a.values返回值集合,既然返回的是集合,就可使用上面集合中說到的運算,大大簡化操做。
在查找字典中的某個鍵時,若是鍵不存在就會報錯,影響程序運行,爲了不沒必要要的麻煩,咱們可使用d.get(k, default),給找不到的鍵一個默認值。使用get的問題是,它不太符合python的哲學,d[k]比d.get(k)更加直觀和簡潔。
其實咱們還能夠這樣,使用setdefault(k, default)來指定一個默認值,這個方法比get方法更高效,可是咱們須要指定特殊的鍵。而使用另外一種辦法defaultdict(),任何鍵在找不到的狀況下都會用defaultdict()中的值(數據類型好比list、str)替換。
d = {1: 'a', 2: 'b', 3: 'c'} d.get(4, 'd') import collections from collections import defaultdict d.setdefault(4, 'd') d[4] # 若是查詢5找不到,還要指定默認值 # 找不到的話用空字符串替換 d = defaultdict(str) d[5]
''
第二個要說的是OrderedDict
,它能夠保持字典中的順序,插入時是什麼樣就是什麼樣,不會改變。在設計API時就可使用OrderDict建立你的數據接口。
怎麼合併兩個或者多個字典?使用ChainMap
,接受字典做爲參數,若是參數中某個鍵重複了,ChainMap會返回第一個字典中的值,這個方法也是放在collections模塊下。
a = {'x': 1, 'z': 3 } b = {'y': 2, 'z': 4 } from collections import ChainMap c = ChainMap(a,b) print(c['x']) print(c['y']) # 只會返回第一個參數a中的z print(c['z'])
1 2 3
本人才疏學淺,上文中不免有些錯誤,還請各位品評指正。若是以爲寫的還行,歡迎關注個人公衆號MLGroup,帶你走進機器學習的世界。