元組的定義爲不可變動的有序對象集合,和列表只有一個區別:不可改變。也就是說元組聲明後是不能改變其內容的。python
這有意義嗎?列表不是已經很好用了嘛。不,這真的頗有意義。數組
咱們回想如下Java或者PHP,在實際使用中是否是會聲明大量的const
值,好比錯誤代碼,或者描述性文字之類的直接寫入代碼的硬編碼部分。這些內容都是一旦聲明你就不但願其它程序有意或者無心地去改寫。數據結構
但這些在Python中是沒法實現的,由於Python並不支持const
,而元組就是一種代替品。性能
《Head first Python》一書指出元組的性能是遠優於列表的,Python解釋器在這方面有針對性優化。固然這點是很容易理解的,畢竟對於一個兼顧數組和鏈表,功能相對複雜的容器,一個不可變的簡單數據結構天然在某些性能上會賽過。但這裏仍是有不少東西能夠細細琢磨,好比空間複雜度列表顯而易見的要高出,但在讀取方面,元組的時間複雜度是真的能優於列表?它是怎麼作到的?學習
要直接聲明一個元組能夠這樣:優化
a = ("a","b","c") print(a)
輸出編碼
('a', 'b', 'c')code
這很容易,和列表的惟一區別就是把中括號換成了小括號。對象
但有一種特例須要特別說明,若是你要聲明的元組中只包含一個元素,那你不能寫成('a')
,而是要寫成('a',)
,緣由也很明顯,對於前者,Python解釋器會認爲()
是優先級運算符,而非元組聲明,只有加入一個逗號才能確實指明這裏是元組聲明。rem
類型轉換也很好理解,既然元組就是不能改變的列表,那固然能夠直接由列表轉換成元組,固然字符串什麼的也是能夠的:
a = tuple(["a","b","c"]) print(a)
輸出
('a', 'b', 'c')
集合的定義是無序且具備惟一性的對象容器。這裏集合這個概念其實就是中學數學裏的集合,二者徹底一致。它具備兩個特性:
a = {"a","b","c"} print(a)
輸出
{'a', 'b', 'c'}
集合的聲明很簡單,同字典相似,使用大括號,區別就是集合中沒有鍵值對。
和其它經常使用容器同樣,集合也能夠經過類型鑽換建立:
a = set("aabbccddee") print(a)
輸出
{'a', 'c', 'd', 'e', 'b'}
能夠看到轉換前的字符串是有重複字符的,但集合的特性決定了轉換後必然是去重的。
前面說過了,集合是一個數學上的概念,天然也支持數學上的集合運算,即交集,並集和補集。
a = set("abcde") b = set("be12345gw") c = a.intersection(b) print(a) print(b) print(c)
輸出
{'b', 'a', 'e', 'c', 'd'}
{'2', '3', 'b', '4', 'w', '5', 'e', '1', 'g'}
{'b', 'e'}
能夠看出,交集就是求兩個集合重複的元素集。
a = set("abcde") b = set("be12345gw") c = a.union(b) print(a) print(b) print(c)
輸出
{'b', 'c', 'e', 'a', 'd'}
{'5', '3', 'b', 'g', '1', '4', '2', 'e', 'w'}
{'w', '5', '3', 'b', 'g', 'c', '1', '4', '2', 'e', 'a', 'd'}
並集也很好理解,就是兩個集合的全部元素加起來,再去重。
補集也有叫差集,定義爲b在a中的補集即a中的元素減去a和b的交集。對應的代碼示例以下:
a = set("abcde") b = set("be12345gw") c = a.difference(b) print(a) print(b) print(c)
輸出
{'b', 'c', 'd', 'a', 'e'}
{'4', '2', 'e', '1', '5', '3', 'w', 'b', 'g'}
{'a', 'd', 'c'}
若是要求a在b中的補集那就是反過來b.difference(a)
。
若是想和我同樣複習一下集合的數學概念的,能夠閱讀百度百科。
集合在某些狀況下極爲有用,好比要對比兩個字符串,求它們中重複的字符,在這種狀況下將其轉換爲兩個集合再求交集便可。
這裏再也不一一舉例,對於各類容器,只有常常思考,使用中對比其各自優缺點,才能真正運用自如。
對集合的增刪改查相對簡單,這裏簡單介紹一下:
a = set("abcde") #追加元素 a.add("f") print(a) #刪除元素 a.remove("a") print(a)
輸出
{'f', 'b', 'e', 'c', 'a', 'd'} {'f', 'b', 'e', 'c', 'd'}