數據類型之集合

在python中集合分兩種:html

  • set: 可變集合
  • fronzenset: 不可變集合

集合的特色:python

  • 無序,非線性結構,不能夠索引
  • 不重複,經常使用於去重
  • 可迭代
  • 元素必須是可hash的,即不可變類型,包括嵌套數據結構中的元素
  • 經過hash table實現,查詢速度極快,能夠高效地判斷元素是否存在於某個集合
  • 集合很消耗內存

線性結構的查詢時間複雜度是O(n),即隨着數據規模的增大而耗時增長。set和dict經過hash table實現,時間複雜度是O(1),查詢時間與數據規模無關。數據結構

建立一個set。注意:建立一個空集合必須使用set()而不是{},{}用來建立一個空字典code

s1 = set('abcde')
s2 = set(['a','b','c','d','e'])
s3 = {'a','b', 'c', 'd', 'e'}
print(s1)
print(s2)
print(s3)
# {'c', 'a', 'e', 'd', 'b'}
# {'c', 'a', 'e', 'd', 'b'}
# {'c', 'a', 'e', 'd', 'b'}

建立一個frozensethtm

s4 = frozenset('abcde')
print(s4)
# frozenset({'c', 'a', 'e', 'd', 'b'})

集合運算索引

s5 = set('cefxyz')

# 並集(合集),相加
print(s1 | s5)
# 這裏能夠傳遞一個或多個iterable,返回一個新的集合
print(s1.union(s5))
# 'z', 'd', 'f', 'c', 'x', 'a', 'e', 'b', 'y'}

# 並等
s1 |= s5
print(s1)
# {'c', 'd', 'e', 'z', 'b', 'f', 'a', 'y', 'x'}
# 這裏也能夠傳遞一個或者多個iterable,不一樣的是這裏是就地修改
s1.update('opq')
print((s1))
# {'o', 'a', 'm', 'd', 'c', 'b', 'e', 'q', 'p'}

# 交集,公共部分
print(s1 & s5)
print(s1.intersection(s5))
# {'c', 'e'}

# 交等
s1 &= s5
print(s1)
print(s1.intersection_update('opq'))
# {'c', 'e'}

# 差集,相減
print(s1 - s5)
print(s1.difference(s5))
# {'b', 'a', 'd'}

# 差等
s1 -= s5
print(s1)
s1.difference_update(s5)
# {'b', 'a', 'd'}

# 對稱差集,並集減去交集
print(s1 ^ s5)
print(s1.symmetric_difference(s5))
# {'x', 'a', 'b', 'z', 'y', 'd', 'f'}

# 對稱差等
s1 ^= s5
print(s1)
s1.symmetric_difference_update(s5)
# {'x', 'a', 'b', 'z', 'y', 'd', 'f'}

對於兩個集合A和B,若是A是B的子集,且A不等於B,那麼A就是B的真子集,B是A的真超集。ip

判斷一個集合是不是另外一個集合的子集內存

s6 = {'a', 'b', 'c', 'd', 'e', 'f', 'g'}
print(s1.issubset(s6))
# True
print(s1 <= s6)
# True

# 判斷真子集
print(s1 < s6)
# True

判斷一個集合是不是另外一個集合的超集(父集)rem

print(s6.issuperset(s1))
# True
print(s6 >= s1)
# True

# 判斷真超集
print(s6 > s1)
# True

判斷兩個集合是否沒有交集get

print(s1.isdisjoint(s6))
# False

添加一個元素

s1.add('m')
print((s1))
# {'a', 'c', 'e', 'b', 'm', 'd'}

刪除一個元素

# 對於remove()方法,若是元素不存在將拋出KeyError異常
s1.remove('a')
print((s1))
# {'p', 'e', 'c', 'd', 'm', 'o', 'q', 'b'}

# discard()方法一樣用來刪除一個元素,不過元素不存在時不作任何操做,而且不會拋出異常
s1.discard('b')
print(s1)
# {'q', 'd', 'o', 'e', 'p', 'c', 'm'}

# pop()刪除任意一個元素並返回它的值,若是集合爲空將拋出KeyError異常
res = s1.pop()
print(res)
# d

參考:
https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset
http://www.runoob.com/python3/python3-set.html
https://zh.wikipedia.org/wiki/集合_(數學)

相關文章
相關標籤/搜索