在Python set是基本數據類型的一種集合類型,它有可變集合(set())和不可變集合(frozenset)兩種。
創建集合set、集合set添加、集合刪除、交集、並集、差集的操作都是非常實用的方法。
set 是一個無序的元素集合,支持並、交、差及對稱差等數學運算, 但由於 set 不記錄元素位置,因此不支持索引、分片等類序列的操作。
tuple算是list和str的雜合(雜交的都有自己的優勢,上一節的末后已經顯示了),那么set則可以堪稱是list和dict的雜合.
set擁有類似dict的特點:可以用{}花括號來定義;其中的元素沒有序列,也就是是非序列類型的數據;而且,set中的元素不可重復,這就類似dict的鍵.
set也有一點list的特點:有一種集合可以原處修改.
一:創建集合set:
python set類是在python的sets模塊中,大家現在使用的python2.3中,不需要導入sets模塊可以直接創建集合。
>>>set('boy')
set(['y', 'b', 'o'])
二:集合添加、刪除
集合的添加有兩種常用方法,分別是add和update。集合add方法:是把要傳入的元素做為一個整個添加到集合中,例如:
>>> a = set('boy')
>>> a.add('python')
>>> a
set(['y', 'python', 'b', 'o'])
集合update方法:是把要傳入的元素拆分,做為個體傳入到集合中,例如:
>>> a = set('boy')
>>> a.update('python')
>>> a
set(['b', 'h', 'o', 'n', 'p', 't', 'y'])
集合刪除操作方法:remove
set(['y', 'python', 'b', 'o'])
>>> a.remove('python')
>>> a
set(['y', 'b', 'o'])
set的常用方法
add, update
>>> help(set.add)
Help on method_descriptor:
add(...)
Add an element to a set.
This has no effect if the element is already present.
下面在交互模式這個最好的實驗室里面做實驗:
>>> a_set = {} #我想當然地認為這樣也可以建立一個set
>>> a_set.add("qiwsir") #報錯.看看錯誤信息,居然告訴我dict沒有add.我分明建立的是set呀.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'add'
>>> type(a_set) #type之后發現,計算機認為我建立的是一個dict
<type 'dict'>
特別說明一下,{}這個東西,在dict和set中都用.但是,如上面的方法建立的是dict,不是set.這是python規定的.要建立set,只能用前面介紹的方法了.
>>> a_set = {'a','i'} #這回就是set了吧
>>> type(a_set)
<type 'set'> #果然
>>> a_set.add("qiwsir") #增加一個元素
>>> a_set #原處修改,即原來的a_set引用對象已經改變
set(['i', 'a', 'qiwsir'])
>>> b_set = set("python")
>>> type(b_set)
<type 'set'>
>>> b_set
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> b_set.add("qiwsir")
>>> b_set
set(['h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])
>>> b_set.add([1,2,3]) #報錯.list是不可哈希的,集合中的元素應該是hashable類型。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> b_set.add('[1,2,3]') #可以這樣!
>>> b_set
set(['[1,2,3]', 'h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])
除了上面的增加元素方法之外,還能夠從另外一個set中合並過來元素,方法是set.update(s2)
>>> help(set.update)
update(...)
Update a set with the union of itself and others.
>>> s1
set(['a', 'b'])
>>> s2
set(['github', 'qiwsir'])
>>> s1.update(s2) #把s2的元素並入到s1中.
>>> s1 #s1的引用對象修改
set(['a', 'qiwsir', 'b', 'github'])
>>> s2 #s2的未變
set(['github', 'qiwsir'])
如果僅僅是這樣的操作,容易誤以為update方法的參數只能是集合。非也。看文檔中的描述,這個方法的作用是用原有的集合自身和其它的什么東西構成的新集合更新原來的集合。這句話有點長,可以多讀一遍。分解開來,可以理解為:others是指的作為參數的不可變對象,將它和原來的集合組成新的集合,用這個新集合替代原來的集合。舉例:
>>> s2.update("goo")
>>> s2
set(['github', 'o', 'g', 'qiwsir'])
>>> s2.update((2,3))
>>> s2
set([2, 3, 'g', 'o', 'github', 'qiwsir'])
所以,文檔的寓意還是比較深刻的。
pop, remove, discard, clear
>>> help(set.pop)
pop(...)
Remove and return an arbitrary set element.
Raises KeyError if the set is empty.
>>> b_set
set(['[1,2,3]', 'h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])
>>> b_set.pop() #從set中任意選一個刪除,並返回該值
'[1,2,3]'
>>> b_set.pop()
'h'
>>> b_set.pop()
'o'
>>> b_set
set(['n', 'p', 't', 'qiwsir', 'y'])
>>> b_set.pop("n") #如果要指定刪除某個元素,報錯了.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pop() takes no arguments (1 given)
set.pop()是從set中任意選一個元素,刪除並將這個值返回.但是,不能指定刪除某個元素.報錯信息中就告訴我們了,pop()不能有參數.此外,如果set是空的了,也報錯.這條是幫助信息告訴我們的,看官可以試試.要刪除指定的元素,怎么辦?
>>> help(set.remove)
remove(...)
Remove an element from a set; it must be a member.
If the element is not a member, raise a KeyError.
set.remove(obj)中的obj,必須是set中的元素,否則就報錯.試一試:
>>> a_set
set(['i', 'a', 'qiwsir'])
>>> a_set.remove("i")
>>> a_set
set(['a', 'qiwsir'])
>>> a_set.remove("w")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'w'
跟remove(obj)類似的還有一個discard(obj):
>>> help(set.discard)
discard(...)
Remove an element from a set if it is a member.
If the element is not a member, do nothing
與help(set.remove)的信息對比,看看有什么不同.discard(obj)中的obj如果是set中的元素,就刪除,如果不是,就什么也不做,do nothing.新聞就要對比着看才有意思呢.這里也一樣.
>>> a_set.discard('a')
>>> a_set
set(['qiwsir'])
>>> a_set.discard('b')
>>>
在刪除上還有一個絕殺,就是set.clear(),它的功能是:Remove all elements from this set.(看官自己在交互模式下help(set.clear))
>>> a_set
set(['qiwsir'])
>>> a_set.clear()
>>> a_set
set([])
>>> bool(a_set) #空了,bool一下返回False.
False
