Python基礎之(四)之集合

集合Set相似字典的特色,能夠用{}花括號來定義;其中的元素是沒有序列,也就是非序列類型的數據;並且集合中的元素不可重複,這就相似於dict鍵。python

建立集合

>>> s1 = set("qiswri") #有兩個i
>>> s1
set(['q', 'i', 's', 'r', 'w']) #只有一個i
>>> 
>>> s2 = set([123,"google","facebook","book","facebook"]);
>>> s2
set(['facebook', 123, 'google', 'book']) #只有一個facebook

說明集合中的元素是不能重複的,在建立集合的時候,若是發現了重複的元素,就會自定過濾重複的元素。而且集合中的元素也是隨機排序的。shell

除了用set()來建立集合,還能夠使用{}的方式,可是這種方式不提倡使用,由於在某些狀況下,Python搞不清楚是字典仍是集合。函數

unhashtable(不可哈希的)表示可變數據,如列表和字典都能原地修改,就是unhastable的;
hastable(可哈希)表示不可變數據,如字符串不能修改。google

>>> s1
set(['q', 'i', 's', 'r', 'w'])
>>> s1[1] = "w"   #集合不是序列類型,不能用索引方式對其進行修改

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    s1[1] = "w"
TypeError: 'set' object does not support item assignment

list()和set()實現集合和列表兩種對象之間的轉化。code

>>> s2
set(['facebook', 123, 'google', 'book'])
>>> type(s2)
<type 'set'>
>>> lst = list(s2)
>>> lst
['facebook', 123, 'google', 'book']
>>> type(lst)
<type 'list'>
>>> s3 = set(lst)
>>> s3
set(['google', 123, 'facebook', 'book'])

集合的函數

dir(set):列出集合的函數對象

add和update

help(set.add)排序

>>> s1 = set(["a","b","c"])
>>> s1
set(['a', 'c', 'b'])
>>> s1.add("abc") #向集合中添加元素
>>> s1
set(['a', 'c', 'b', 'abc'])

>>> s1.add([1,2,3]) #不能添加列表,由於列表的數據是可變的

Traceback (most recent call last):
  File "<pyshell#31>", line 1, in <module>
    s1.add([1,2,3])
TypeError: unhashable type: 'list'
>>> 
>>> s1
set(['a', 'c', 'b', 'abc'])
>>> s2 = set(["e","f","g"])
>>> s1.update(s2) #集合s2添加到s1中
>>> s1
set(['a', 'c', 'b', 'e', 'abc', 'g', 'f'])
>>> s2
set(['e', 'g', 'f'])

pop、remove、discard、clear

>>> s1
set(['a', 'c', 'b', 'e', 'abc', 'g', 'f'])
>>> s1.pop() #隨機刪除一個元素,並返回這個元素
'a'
>>> s1.pop()
'c'
>>> s1.pop("b")  #不能指定參數

Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    s1.pop("b")
TypeError: pop() takes no arguments (1 given)
>>> 
>>> s1.remove("b") #刪除集合中指定的元素
>>> s1
set(['e', 'abc', 'g', 'f'])
>>> s1.remove()  #remove必須指定參數

Traceback (most recent call last):
  File "<pyshell#47>", line 1, in <module>
    s1.remove()
TypeError: remove() takes exactly one argument (0 given)
>>> s1.discard("g") #存在則刪除集合中的元素
>>> s1
set(['e', 'abc', 'f'])
>>> s1.discard("i") #不存在則不作處理,不拋出異常
>>>
>>> s1.clear()  #清空集合
>>> s1
set([])

不變的集合

>>> f1 = frozenset("qwert")
>>> f1
frozenset(['q', 'r', 'e', 't', 'w'])
>>> f1.add("q") #不能修改集合

Traceback (most recent call last):
  File "<pyshell#62>", line 1, in <module>
    f1.add("q")
AttributeError: 'frozenset' object has no attribute 'add'
>>> f1.remove("r")

Traceback (most recent call last):
  File "<pyshell#63>", line 1, in <module>
    f1.remove("r")
AttributeError: 'frozenset' object has no attribute 'remove'
>>> f1.pop()

Traceback (most recent call last):
  File "<pyshell#64>", line 1, in <module>
    f1.pop()
AttributeError: 'frozenset' object has no attribute 'pop'

集合元素

元素與集合的關係

>>> aset=set(["q","w","e","r","t"])
>>> aset
set(['q', 'r', 'e', 't', 'w'])
>>> "q" in aset
True
>>> "a" in aset
False

集合與集合的關係

A是否等於B

>>> a
set(['q', 'r', 'e', 't', 'w'])
>>> b = set(["a","b","c"])
>>> a == b
False
>>> a != b
True

A是不是B的子集

>>> c = set(["q","r"])
>>> a
set(['q', 'r', 'e', 't', 'w'])
>>> 
>>> c.issubset(a) #判斷c是不是a的子集
True
>>> a.issuperset(c) #判斷a是不是c的超集
True

AB的並集

>>> a
set(['q', 'r', 'e', 't', 'w'])
>>> b
set(['a', 'c', 'b'])
>>> a | b
set(['a', 'c', 'b', 'e', 'q', 'r', 't', 'w']) #ab的並集
>>> a.union(b)
set(['a', 'c', 'b', 'e', 'q', 'r', 't', 'w']) #ab的並集

AB的交集

>>> a
set(['q', 'r', 'e', 't', 'w'])
>>> b
set(['a', 'q', 'c', 'b'])
>>> a & b   #ab的交集
set(['q'])
>>> a.intersection(b)
set(['q'])

A相對B的差集

A相對B不一樣的部分元素集合索引

>>> a
set(['q', 'r', 'e', 't', 'w'])
>>> b
set(['a', 'q', 'c', 'b'])
>>> a - b
set(['r', 'e', 't', 'w'])
>>> a.difference(b)
set(['r', 'e', 't', 'w'])

AB的差集

AB中不一樣元素的集合rem

>>> a
set(['q', 'r', 'e', 't', 'w'])
>>> b
set(['a', 'q', 'c', 'b'])
>>> a.symmetric_difference(b)
set(['a', 'c', 'b', 'e', 'r', 't', 'w'])
相關文章
相關標籤/搜索