1. 程式人生 > 其它 >python集合常用操作彙總

python集合常用操作彙總

1. 集合型別 

  {} 集合是一種無序不可重複的序列;集合常用於對兩個列表的交併差處理;

  集合沒有任何獲取元素的方法,只用作處理列表或元組的臨時資料型別,不適合資料的儲存和傳輸。

2. 集合的建立 {}或set()函式

  • 將一個用逗號分割的元素列表放在一堆花括號內可以建立一個非空set集合,如{'Tom', 'Jerry', 'Peter'}
  • 給set的構建函式傳遞一個空值將會建立一個空set集合(注意:{}表示的是一個空字典而不是空set集合)
  • 給set的構架你函式傳一個非空iterable引數將會建立一個非空set集合
# 使用內建函式set()建立空集合
set_1 = set()
print(set_1,type(set_1),"\n")
# {}表示的是一個空字典而不是空set集合
set_2 = {}
print(set_2,type(set_2),"\n")

# 用{ }建立集合物件時,集合內元素必須是不可變資料型別
# set_3 = {[34, 56], [78, 90]}
# 注:TypeError: unhashable type: 'list'

# [1,2,3,4,4] set()方法可以包裹列表,且可幫助列表去重
list_set = [1,2,3,4,4]
# 此時可能想再轉回列表,利用列表內建函式list()即可
set_4 = set(list_set)
print(set_4,type(set_4),"\n")

# 字典同理
# set_test = {{'name': 'll'}}
# TypeError: unhashable type: 'dict'
dict_set = set({'name': 'll'})
# {'name'} 留下的是key值
print(dict_set,type(dict_set))

執行結果:

set() <class 'set'> 

{} <class 'dict'> 

{1, 2, 3, 4} <class 'set'> 

{'name'} <class 'set'>

3.集合增加元素的操作

  可以利用set.add(元素) 一次增加一個元素;

  利用set.update(可迭代物件) 一次增加多個元素;已經存在的元素不會重複新增;

set_demo = {1,2,"abc","ef"}
set_demo.add(520)
print(set_demo)
set_demo.update(['1314','傻子'])
print(set_demo)

4.集合中刪除元素的操作

  set.remove(元素)  刪除指定元素;

  set.clear()  清空集合中元素;

  利用python內建函式del ;

set_demo = {1,2,"abc","ef"}
set_demo.remove(1)
print(set_demo)
# KeyError: 'py' (元素不存在時會報錯)
# set_demo.remove(1111)

# 元素不存在時不會報錯
set_demo.discard(2)
print(set_demo)
set_demo.clear()
print(set_demo)
# NameError: name 'set_demo' is not defined
# del set_demo
# print(set_demo)

執行結果:

{'ef', 2, 'abc'}
{'ef', 'abc'}
set()

 5.集合之間的運算

5.1 集合的差集

  • a, b兩個集合,屬於a且不屬於b的元素集,就是a與b的差集;
  • 利用difference函式,a.difference(b)可以獲取結果; 或直接a - b;
  • a.difference_update(b) 將差集結果賦值給a、此時b不變;
a = {1,2,3,4}
b = {3,4,5,6}
print(a.difference(b))
print(a-b)
print(a,b)
print(id(a))
# a原有的集合物件被修改了,集合b未被修改
a.difference_update(b)
print(a,b)
print(id(a))

執行結果:  

{1, 2}
{1, 2}
{1, 2, 3, 4} {3, 4, 5, 6}
2503182612320
{1, 2} {3, 4, 5, 6}
2503182612320

5.2 集合的交集 

  • a,b集合中共有的元素集;
  • a.intersection(b, c...)  可以多個集合一起取交集;
  • 利用&符號, a & b & c;
  • a.intersection_update(b, c...)  將交集結果更新到a集合;
a = {1,2,3,4}
b = {3,4,5,6}
c = {3,7,8}
print(a & b & c)
print(a.intersection(b,c))
a.intersection_update(b,c)
print(a,b,c)

執行結果:

{3}
{3}
{3} {3, 4, 5, 6} {8, 3, 7}

5.3 集合的並集 

  • 幾個集合中所有元素組成的集合;
  • a.union(b, c ...) ;
  • a  |  b  |  c ;
a = {1,2,3,4}
b = {3,4,5,6}
c = {3,7,8}
print(a | b | c)
print(a.union(b,c))
print(a,b,c)

執行結果: 

{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3, 4} {3, 4, 5, 6} {8, 3, 7}

5.4 對稱差集

  • 只在a和只在b中的元素集合;
  • a.symmetric_difference(b)、a.symmetric_difference_update(b)、a ^ b
a = {1,2,3,4}
b = {3,4,5,6}
print(a ^ b)
print(a.symmetric_difference(b))
a.symmetric_difference_update(b)
print(a,b)

執行結果:

{1, 2, 5, 6}
{1, 2, 5, 6}
{1, 2, 5, 6} {3, 4, 5, 6}

5.5 集合的一些返回值是bool型的函式

  • a.isdisjoint(b)  判斷兩集合是否沒有相同元素;
  • a.issubset(b) 判斷一個集合a是否是集合b 的子集;
  • 與子集相對,b.issuperset(a) 判斷集合b是否是集合a的超集
a = {1,2,3,4}
b = {3,4,5,6}
print(a.isdisjoint(b))
print(a.isdisjoint("5"))
print(a.issubset({1,2,3,4,5}))
print(a.issuperset({1,2}))

執行結果: 

False
True
True
True

6. 簡單函式在集合的使用

  • in 、not in 成員判斷;
  • len(set)  集合長度;
a = {1,2,3,4}
print(1 in a)
print(len(a))

執行結果: 

True
4

7. frozenset() 建立不可變集合

  • 不可變集合之於集合,相當於元組之於列表
  • 因為{ }建立集合時,儲存的物件必須是不可變型別元素,所以想儲存另一個集合時,就不可以了,frozenset就解決了這個問題
  • frozenset還可以作為字典的key、且存在雜湊值;
# frozenset(可迭代物件)
# 可以傳集合
a = frozenset({34, 56})
print(a)  # frozenset({56, 34})

# 可以傳列表
b = frozenset([3, 4])
print(b)   # frozenset({3, 4})
# 可以傳元組
c = frozenset((454,))
print(c)   # frozenset({454})

# { }建立集合時,集合中不能儲存集合
# d = {{34}}  # TypeError: unhashable type: 'set'
# 可以儲存不可變集合
d = {frozenset([454])}
print(d)   # {frozenset({454})}

a = frozenset({34, 56})
print(a)  # frozenset({56, 34})
# AttributeError: 'frozenset' object has no attribute 'add'
# a.add(45) 
# frozenset就不存在更改操作相關的方法了

e = frozenset('eee')
print(e)  # frozenset({'e'})