1. 程式人生 > >【python學習筆記】set集合

【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包含st中的每一個元素( t 和 s的並集);
  • s.intersection(t):等價於s & t,返回一個新的set包含st中的公共元素(t 和 s的交集);
  • s.difference(t):等價於s - t,返回一個新的set包含s中有但是t中沒有的元素(項在t中,但不在s中);
  • s.symmetric_difference(t):等價於s ^ t,返回一個新的 set 包含st中不重複的元素(項在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
另外,SetImmutableSet兩者都支援setset之間的比較。兩個sets在也只有在這種情況下是相等的:每一個set中的元素都是另一箇中的元素(二者互為subset)。一個set比另一個set小,只有在第一個 set 是第二個setsubset時(是一個subset,但是並不相等)。一個 set 比另一個set打,只有在第一個 set 是第二個setsuperset時(是一個superset,但是並不相等)。
set和相等比較並不產生完整的排序功能。例如:任意兩個sets都不相等也不互為子set,因此以下的運算都會返回Falsea<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,看看是否會報錯。