python集合類型

集合類型簡介

集合也是容器,其內元素都是無序、惟1、不可變的。它經常使用來作成員測試、移除重複數據、數據計算(好比交集、並集、差集)。python

集合Set是dict的無value版。集合也使用大括號包圍:函數

>>> s = {'a','b','c'}
>>> type(s)
<class 'set'>

Set中的元素和dict同樣也是經過hash值來存儲的:將元素hash()獲得hash值,存儲到Set中。因此,Set中的元素必須是不可變數據(例如列表不能放進集合中)。但集合自身是可變的,能夠修改其中的元素。此外,python提供了另外一種不可變的集合類型frozenset。測試

使用大括號或set()構造方法能夠構造集合。code

s = {'a','b','c'}
s = set("abc")
s = frozenset("abc")

須要注意的是,空的{}表示的字典,而不是集合,若是想要構造空集合,可使用不帶參數的set()來構造。索引

因爲集合是經過hash值來存儲的,沒有位置索引。因此無法對集合進行單元素的檢索,只能對集合進行修改操做,或迭代、遍歷。rem

集合運算操做

>>> x = set("abcde")
>>> y = set("defgh")
>>> z = set("opq")
>>> x
{'b', 'e', 'c', 'a', 'd'}
>>> y
{'e', 'h', 'f', 'g', 'd'}

集合的運算有交集、並集、差集等操做。它們都有兩種方式:操做符號版的,方法函數版的。符號版的都只能集合對集合,函數版的能夠集合和其它比較,好比列表。hash

交集&或intersection()方法:io

>>> x & y
{'e', 'd'}

>>> x.intersection(y)
{'e', 'd'}

>>> x & ["a", "c"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'set' and 'list'

>>> x.intersection(["a","c"])
{'c', 'a'}

並集|或union()方法:ast

>>> x | y
{'b', 'e', 'h', 'c', 'a', 'f', 'g', 'd'}
>>> x | y | z

>>> x.union(y)
>>> x.union(["x", "y"])
>>> x.union(["x", "y"], ["o", "p"])

差集-或difference():class

>>> x-y
{'c', 'a', 'b'}
>>> y-x
{'g', 'f', 'h'}

>>> x.difference(y)
{'c', 'a', 'b'}
>>> y.difference(x)
{'g', 'f', 'h'}

還有XOR操做,取集合一、集合2中非交集的部分:

>>> x ^ y
{'f', 'a', 'h', 'b', 'c', 'g'}

>>> x.symmetric_difference(y)

下面是測試兩個集合之間是不是子集、真子集、超集的關係,s1和s2都是集合。一樣,使用函數版的能夠是其它類型。

# 子集
s1 <= s2
s1.issubset(s2)
s1.issubset(other_type)

# 真子集
s1 < s2

# 超集
s1 >= s2
s1.issuperset(s2)
s1.issuperset(other_type)

# 真超集
s1 > s2

s1.isdisjoint(other_type)測試集合和另外一個數據容器(如集合、列表)是否存在相交數據。即集合中的元素和其它容器是否有共同數據,若是有則返回False,不然返回True。

>>> x.isdisjoint(y)
False

>>> x.isdisjoint(z)
True

>>> x.isdisjoint(list("ab"))
False
>>> x.isdisjoint(list("opq"))
True

集合基本操做

集合類型(不是frozenset)是可變的容器類型,能夠修改它(但無法檢索它)、測試、迭代它,但不能檢索它(除非迭代、遍歷)。

s1.add(elem)添加元素到集合s1中。由於集合中的元素都惟一,因此添加已存在的元素不會有任何效果,但也不會報錯。

s1.remove(elem)移除集合s1中的元素。

s1.pop()隨機移除一個元素並返回這個元素。

s1.clear()清空集合。

s1.discard(elem)移除已存在的某個元素,若是不存在則無視(返回None)。

s1.copy()拷貝(淺拷貝)集合s1。

len(s1)返回集合s1長度。

i in s1測試元素i是否在集合s1中。

除了這些基本操做外,還有基於集合運算的修改操做。

取得並集後覆蓋集合s1:

s1.update(*others)
s1 |= other |...

取得交集後覆蓋集合s1:

s1.intersection_update(*others)
s1 &= other & ...

取得差集後覆蓋集合s1:

s1.difference_update(*others)
s1 -= other |...

取得XOR運算後的結果覆蓋集合s1:

s1.symmetric_difference_update(other)
s1 ^= other

集合解析

到目前爲止,各類解析表達式的方式已經很清晰了。因此看示例便可:

>>> {x for x in 'abcde'}
{'b', 'e', 'c', 'a', 'd'}

>>> {c*2 for c in "abcde"}
{'ee', 'bb', 'cc', 'dd', 'aa'}
相關文章
相關標籤/搜索