【python學習筆記】set集合
1、集合說明
集合(set
)是一個無序不重複元素的集。基本功能包括關係測試和消除重複元素。集合物件還支援 union(聯合),intersection(交),difference(差)和 sysmmetric difference(對稱差集)等數學運算。
2、建立一個集合
大括號或 set()
函式可以用來建立集合。注意:想要建立空集合,你必須使用 set()
而不是 {}
。後者用於建立空字典。
建立方法範例:
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
注意,傳入的引數[1, 2, 3]
是一個list
{1, 2, 3}
只是告訴你這個set
內部有1,2,3這3個元素,顯示的順序也不表示set
是有序的。集合是沒有重複元素的,如果在建立時傳入重複元素,則會被自動過濾掉,例如:
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
也可以先定義一個list,然後轉為set,例如:
>>> basket=['apple','orange','apple','pear','banana']
>>> fruit=set(basket)
>>> fruit
{ 'pear', 'orange', 'banana', 'apple'}
注意重複元素apple
被自動刪掉了,如果是python2.x則返回是set(['orange', 'pear', 'apple', 'banana'])
或者如果我們想獲得一個字串的set集合,可以這樣:
>>> a=set('abcdefg')
>>> a
{'f', 'd', 'g', 'a', 'b', 'c', 'e'}
3、新增元素
通過add(key)
方法可以新增元素到set中,可以重複新增,但不會有效果:
>>> a=set('abcdefg' )
>>> a.add('f')
>>> a
{'f', 'd', 'g', 'a', 'b', 'c', 'e'}
>>> a.add('h')
>>> a
{'f', 'h', 'd', 'g', 'a', 'b', 'c', 'e'}
>>>
4、一次性新增多個元素
使用update()
方法可以新增多個元素,範例如下:
>>> a=set('abcdefg')
>>> a.update('hij')
>>> a
{'f', 'h', 'd', 'g', 'j', 'a', 'i', 'b', 'c', 'e'}
5、刪除元素
通過remove(key)
方法可以刪除元素:
>>> a.remove('h')
>>> a
{'f', 'd', 'g', 'a', 'b', 'c', 'e'}
>>> a.remove('h')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'h'
用這個方法如果要刪除的元素不存在,則會報錯,所以可以使用s.discard(x)
的方法,此方法如果元素集合s中含有元素x則刪除,否則也不會報錯;
>>> a.discard('h')
>>>
方法pop()
刪除一個隨機元素:
>>> a.pop()
'f'
>>> a
{'d', 'g', 'a', 'b', 'c', 'e'}
clear()
清除集合中所有的元素:
>>> a.clear()
>>> a
set()
6、長度
方法’len(s)`即可,範例:
>>> a
{'f', 'h', 'd', 'g', 'j', 'a', 'i', 'b', 'c', 'e'}
>>> len(a)
10
7、包含關係
包含關係用in
或者not in
即可;
- x in s:測試 x 是否是 s 的成員
- x not in s:測試 x 是否不是 s 的成員
>>> a
{'f', 'h', 'd', 'g', 'j', 'a', 'i', 'b', 'c', 'e'}
>>> 'a' in a
True
>>> 'l' in a
False
>>> 'l' not in a
True
8、運算方法
s.issubset(t)
:等價於s <= t
,測試是否s
中的每一個元素都在t
中;s.issuperset(t)
:等價於s >= t
,測試是否t
中的每一個元素都在s
中;s.union(t)
:等價於s | t
,返回一個新的set
包含s
和t
中的每一個元素( t 和 s的並集);s.intersection(t)
:等價於s & t
,返回一個新的set
包含s
和t
中的公共元素(t 和 s的交集);s.difference(t)
:等價於s - t
,返回一個新的set
包含s
中有但是t
中沒有的元素(項在t中,但不在s中);s.symmetric_difference(t)
:等價於s ^ t
,返回一個新的set
包含s
和t
中不重複的元素(項在t或s中,但不會同時出現在二者中);s.update(t)
:等價於s |= t
,返回增加了set
“t”中元素後的set
“s”;s.intersection_update(t)
:等價於s &= t
,返回只保留含有set
“t”中元素的set
“s”;s.difference_update(t)
:等價於s -= t
,返回刪除了set
“t”中含有的元素後的set
“s”;s.symmetric_difference_update(t)
:等價於s ^= t
,返回含有set
“t”或者set
“s”中有而不是兩者都有的元素的 set “s”;
>>> c=set('abcdefg')
>>> b=set('abcd')
>>> d=set('wliaco')
>>> c.issubset(b)
False
>>> c.issuperset(b)
True
>>> c.union(b)
{'a', 'f', 'd', 'g', 'b', 'c', 'e'}
>>> c.intersection(b)
{'d', 'a', 'b', 'c'}
>>> c.difference(b)
{'f', 'g', 'e'}
>>> c.symmetric_difference(d)
{'f', 'd', 'g', 'w', 'e', 'o', 'i', 'l', 'b'}
>>> c.update(d)
>>> c
{'f', 'd', 'g', 'o', 'a', 'i', 'l', 'w', 'b', 'c', 'e'}
>>> c.intersection_update(d)
>>> c
{'o', 'i', 'a', 'l', 'w', 'c'}
>>> c.difference_update(d)
>>> c
set()
>>> b.symmetric_difference_update(d)
>>> b
{'d', 'o', 'i', 'l', 'w', 'b'}
或者不用函式,直接使用運算子:
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a # unique letters in a
set(['a', 'r', 'b', 'c', 'd'])
>>> a - b # letters in a but not in b
set(['r', 'd', 'b'])
>>> a | b # letters in either a or b
set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
>>> a & b # letters in both a and b
set(['a', 'c'])
>>> a ^ b # letters in a or b but not both
set(['r', 'd', 'b', 'm', 'z', 'l'])
請注意:union()
, intersection()
, difference()
和 symmetric_difference()
的非運算子(non-operator,就是形如s.union()
這樣的)版本將會接受任何 iterable
作為引數。相反,它們的運算子版本(operator based counterparts)要求引數必須是sets
。這樣可以避免潛在的錯誤,如:為了更可讀而使用 set('abc') & 'cbs'
來替代 set('abc').intersection('cbs')
。從 2.3.1 版本中做的更改:以前所有引數都必須是 sets
。
另外,Set
和ImmutableSet
兩者都支援set
與set
之間的比較。兩個sets
在也只有在這種情況下是相等的:每一個set
中的元素都是另一箇中的元素(二者互為subset)。一個set
比另一個set
小,只有在第一個 set 是第二個set
的subset
時(是一個subset
,但是並不相等)。一個 set 比另一個set
打,只有在第一個 set 是第二個set
的superset
時(是一個superset
,但是並不相等)。
子set
和相等比較並不產生完整的排序功能。例如:任意兩個sets
都不相等也不互為子set
,因此以下的運算都會返回False
:a<b
, a==b
, 或者a>b
。因此,sets
不提供 __cmp__
方法。
因為sets
只定義了部分排序功能(subset
關係),list.sort()
方法的輸出對於sets
的列表沒有定義。
6、其他
複製:
>>> d=set('wliaco')
>>> d.copy()
{'i', 'a', 'l', 'w', 'o', 'c'}
hash(s)返回s的hash值;
7、和dict的區別
set和dict的唯一區別僅在於沒有儲存對應的value,但是,set的原理和dict一樣,所以,同樣不可以放入可變物件,因為無法判斷兩個可變物件是否相等,也就無法保證set內部“不會有重複元素”。試試把list放入set,看看是否會報錯。