元組 tuple
tuple和list非常類似,但是tuple一旦初始化就不能修改。元組采用圓括號表示。
例如:
>>> tuple = (1,2,3)
>>> tuple
(1, 2, 3)
tuple被定義下來后就不可被改變了,也沒有append(),insert()這樣的方法。其他獲取元素的方法和list是一樣的,可以正常地使用tuple[0]、tuple[-1]進行訪問,但不能賦值成另外的元素。程序通常不遍歷元組,而是只訪問完成當前任務所需的元組的一部分。
不可變的tuple有什么意義?因為tuple不可變,所以代碼更安全。如果可能,能用tuple代替list就盡量用tuple。
tuple的陷阱:當你定義一個tuple時,在定義的時候,tuple的元素就必須被確定下來。
字典中的鍵必須是唯一的同時不可變的,值則沒有限制。
如果只是定義一個元素的tuple,那么這個元素需要在后面跟上一個逗號:
>>> t = (1,)
>>> t
(1,)
定義的不是tuple,是1這個數!這是因為括號()既可以表示tuple,又可以表示數學公式中的小括號,這就產生了歧義,因此,Python規定,這種情況下,按小括號進行計算,計算結果自然是1。所以,只有1個元素的tuple定義時必須加一個逗號,,來消除歧義。
zip函數構造元組:
>>> zip([1,2,3],[4,5,6])
[(1, 4), (2, 5), (3, 6)]
>>> zip([1,2,3],[4,5,6],["x","y","z","d"])
[(1, 4, 'x'), (2, 5, 'y'), (3, 6, 'z')]
一個“可變的”tuple:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
表面上看,tuple的元素確實變了,但其實變的不是tuple的元素,而是list的元素。tuple一開始指向的list並沒有改成別的list,所以,tuple所謂的“不變”是說,tuple的每個元素,指向永遠不變。即指向'a',就不能改成指向'b',指向一個list,就不能改成指向其他對象,但指向的這個list本身是可變的!
集合 set
set和dict類似,也是一組key的集合,但不存儲value。由於key不能重復,所以,在set中,沒有重復的key。
要創建一個set,需要提供一個list作為輸入集合:
>>> s = set([1, 2, 3])
>>> s
set([1, 2, 3])
注意,傳入的參數[1, 2, 3]是一個list,而顯示的{1, 2, 3}只是告訴你這個set內部有1,2,3這3個元素,顯示的順序也不表示set是有序的。
重復元素在set中自動被過濾:
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
set([1, 2, 3])
通過add(key)方法可以添加元素到set中,可以重復添加,但不會有效果:
>>> s = set([1, 2, 3, 5, 6, 7, 9])
>>> s
set([1, 2, 3, 5, 6, 7, 9])
>>> id(s)
140415072840960
>>> s.add(4)
>>> id(s)
140415072840960
>>> s
set([1, 2, 3, 4, 5, 6, 7, 9])
通過remove(key)方法可以刪除元素:
>>> s.remove(4)
>>> s
set([1, 2, 3, 5, 6, 7, 9])
set可以看成數學意義上的無序和無重復元素的集合,因此,兩個set可以做數學意義上的交集、並集等操作:
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
# 交集
>>> s1 & s2
set([2, 3])
# 並集
>>> s1 | s2
set([1, 2, 3, 4])
# 差集
>>> s1 - s2
set([1])
# 對稱差集,不同時出現在兩個集合中的元素
>>> s1 ^ s2
set([1, 4])
set和dict的唯一區別僅在於沒有存儲對應的value,但是,set的原理和dict一樣,所以,同樣不可以放入可變對象,因為無法判斷兩個可變對象是否相等,也就無法保證set內部“不會有重復元素”。
set 中的方法
- s.copy():返回s的副本
- s.difference(t):求差集。返回所有在s中,但不在t中的元素
- s.intersection(t):求交集。返回所有同時在s和t中的元素
- s.union(t):求並集。返回所有在s或t中項目
- s.symmetric_difference(t):求對稱差集,不同時出現在兩個集合中的元素
- s.isdisjoint(t):如果s和t沒有相同的元素,返回True
- s.issubset(t):如果s是t的一個子集,返回True
- s.issuperset(t):如果s是t的一個超集,返回True