摘要:字典和集合都是基于散列表實現的,散列表也就是表,了解過數據結構的應該知道。而使用另一種辦法,任何鍵在找不到的情況下都會用中的值數據類型比如替換。在設計時就可以使用創建你的數據接口。
這次主要說說字典和集合這兩種數據類型。
字典和集合都是基于散列表實現的,散列表也就是hash表,了解過數據結構的應該知道。與散列表相關的一個概念叫做可散列,什么是可散列?在python官方定義中是這樣說的:如果一個對象是可散列的,那么在這個對象的生命周期中,它的散列值是不變的,而且這個對象需要實現__hash__()方法。
python中,原子不可變類型(str、bytes和數值類型)都是可散列類型,同時所有的不可變類型也是可散列的。
集合什么是集合?在數學中指的是具有某種特定性質的事物的總體,在python中集合指許多唯一對象的聚集。注意這個唯一,也就是說集合中不允許重復值出現,所以集合可以用來去重。
在python中,用大括號括起來表示一個集合。
data = [11, 11, 2, 3, 4, 4, 5, 4, 6] set(data)
{2, 3, 4, 5, 6, 11}
將列表類型的data轉換為集合類型后,重復值被去掉了。
在數學中,集合可以求并集、交集、差集等,python也可以做同樣的事。比如:
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,帶你走進機器學習的世界。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41049.html
摘要:找出列表中小于的數據除了列表推導式,還有字典推導式,集合推導式,用法都一樣。如果你的數據量很大的話,考慮使用生成器表達式。切片不僅對列表有用,同樣適用于元組和字符串。切片命名使用方法,內部參數與切片一樣。對剩余的的數據,使用星號代替即可。 上次我們講了幾個不常見的數據類型,每個都有自己特殊的用途,雖然不經常用到,了解一下也好。比如我們提到的數組類型,如果在數據量很大的時候同時要效率,就...
摘要:擠掉了堆中實現了堆排序。你可以用堆排序來查找一個序列中最大的或者最小的幾個元素。除了使用堆排序,中還有排序和,這兩個排序最終生成以列表表示的排序結果,堆排序也是。 這次我們來說說python中的數據結構。當然了,不會講很基礎的內容。 用過python的都知道,python有著與其他語言很不一樣的數據類型,像什么列表、元組、集合、字典之類。這些數據類型造就了python簡單易用同時又很強...
摘要:在中,特殊方法以雙下劃線開始,以雙下劃線結束。真假值,如果向量模為,返回實現向量加法實現向量乘法,例如返回向量的模返回歐幾里德范數找個例子運行下。怎么辦中有個特殊方法,可以修改控制臺輸出的樣式。 什么是特殊方法?當我們在設計一個類的時候,python中有一個用于初始化的方法$__init__$,類似于java中的構造器,這個就是特殊方法,也叫作魔術方法。簡單來說,特殊方法可以給你設計的...
摘要:來說說迭代器和生成器,還有可迭代對象和生成器表達式。有點繞是不是,其實,一般只要知道可迭代對象以及它是如何實現的就行了,中常常用生成器來代替迭代器,可以說,生成器就是迭代器。 來說說迭代器和生成器,還有可迭代對象和生成器表達式。 之前簡單的提到過,一個對象是可迭代的可以理解為能夠使用for循環。這樣說其實不太準確,某個對象可迭代是因為它內部實現了$__iter__$這個特殊方法。比如在...
摘要:先不講數據結構了,這次來說說中一些不被注意的功能。直接交換第二個功能。對的長度使用生成一個序列,然后遍歷或者這樣第三個功能。其實還接受第二個參數,它的作用是在迭代的過程中如果碰到第二個參數則停止。 先不講數據結構了,這次來說說python中一些不被注意的功能。 在python的設計哲學中,有這么一條內容:Simple is better than complex,簡單的代碼比復雜的要好...
閱讀 3208·2021-11-23 09:51
閱讀 3667·2021-09-22 15:35
閱讀 3644·2021-09-22 10:02
閱讀 2956·2021-08-30 09:49
閱讀 508·2021-08-05 10:01
閱讀 3375·2019-08-30 15:54
閱讀 1632·2019-08-30 15:53
閱讀 3557·2019-08-29 16:27