1. 程式人生 > >python學習筆記(六)之集合2

python學習筆記(六)之集合2

lock true 可變 對象 屬於 attribute 聯盟 per rec

python學習筆記(七)之集合2
不變的集合
在”python學習筆記(六)之集合1“中以set()來建立集合,這種方式所創建的集合都是可原地修改的集合,或者說是可變的,也就是說是unhashable。
還有一種集合,不能在原處修改。這種集合的創建方法是用frozenset(),ps:frozen凍結的,是不可變的,也就是說是hashable--可哈希。
實例1:

>> f_set = frozenset("wtf")
>> f_set
frozenset([‘t‘, ‘w‘, ‘f‘])
>> f_set.add("python")

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘frozenset‘ object has no attribute ‘add‘
說明:報錯說集合是不能修改的。
對比可以修改的集合:
實例2:
>> c_set = set("name")
>> c_set
set([‘a‘, ‘e‘, ‘m‘, ‘n‘])
>> c_set.add("python")
>> c_set
set([‘a‘, ‘e‘, ‘m‘, ‘python‘, ‘n‘])

集合運算
元素與集合的關系
只有一種關系:元素要麽屬於集合,要麽不屬於。
實例3:

>> c_set
set([‘a‘, ‘e‘, ‘m‘, ‘python‘, ‘n‘])
>> "a" in c_set
True
>> "wtf" in c_set
False

集合與集合的關系
判斷集合a是否等於集合b
實例4:

>> a = set(["q","w","t","f"])

>> b = set(["w","f","q","t"])
>> a == b
True
>> a != b
False

判斷集合c是否是集合b的子集,或者說b是否是a的超集(超集:即a的元素也都是b的元素,但是b的元素比a的元素數量多。)
實例5:

>> c = set(["w","t","f","g"])
>> d = set(["w","t"])
>> d < c ##d是c的子集
True
>> d.issubset(c) ##d是否是c的子集
True
>> c.issuperset(d) ##c是否是d的超集
True

集合的並集
表達式:a | b
或者使用函數a.union(b) ps:union聯盟
註意:a,b的並集得到的結果就是兩個集合並集,這個結果是新生成的一個對象,不是將集合a擴充!
實例6:

>> a = set(["w","t","f"])
>> b = set(["z","h","a","o"])
>> a | b
set([‘a‘, ‘t‘, ‘w‘, ‘f‘, ‘h‘, ‘z‘, ‘o‘])
>> a.union(b)
set([‘a‘, ‘t‘, ‘w‘, ‘f‘, ‘h‘, ‘z‘, ‘o‘])
>> a
set([‘t‘, ‘w‘, ‘f‘])
>> b
set([‘a‘, ‘h‘, ‘z‘, ‘o‘])

集合的交集
表達式:b & c
或者使用函數b.intersection(c) ps:intersection 路口
實例7:

>> b = set(["z","h","a","o"])
>> c = set(["z","y","d"])
>> b & c
set([‘z‘])
>> b.intersection(c)
set([‘z‘])
>> b
set([‘a‘, ‘h‘, ‘z‘, ‘o‘])
>> c
set([‘y‘, ‘z‘, ‘d‘])

集合的補集
表達式:b - c ##b相對於c的差(補),即b相對於c不同的元素
或者使用函數 b.difference(c)
實例8:

>> b
set([‘a‘, ‘h‘, ‘z‘, ‘o‘])
>> c
set([‘y‘, ‘z‘, ‘d‘])
>> b - c
set([‘a‘, ‘h‘, ‘o‘])
>> c - b
set([‘y‘, ‘d‘])
>> b.difference(c)
set([‘a‘, ‘h‘, ‘o‘])

python學習筆記(六)之集合2