[PY3]——內建資料結構(6)——集合及其常用操作

Jelly_lyj發表於2017-03-18

集合及其常用操作Xmind圖

        

 

 

集合的定義

# set( )
# {0,1,2}          //注意不能用空的大括號來定義集合
# set(可迭代物件)

In [1]: s=set();type(s)
Out[1]: set

In [2]: s={0,1,2};type(s)
Out[2]: set

In [3]: s=set(range(5));type(s)
Out[3]: set

 

增加操作

1. add()

In [8]: s={0,1,2}
#在集合後新增單個元素
In [9]: s.add(3);s
Out[9]: {0, 1, 2, 3}

#增加已存在的元素時,集合不變
In [10]: s.add(3);s
Out[10]: {0, 1, 2, 3}

2. update()

In [12]: s={0,1,2}
#增加一個可迭代物件
In [13]: s.update(range(4,7));s
Out[13]: {0, 1, 2, 4, 5, 6}

In [14]: s.update(range(4,9));s
Out[14]: {0, 1, 2, 4, 5, 6, 7, 8}

 

刪除操作

1. remove() 刪除給定元素,元素不存在丟擲KeyError

In [16]: s={0,1,2}

In [17]: s.remove(0);s
Out[17]: {1, 2}

In [18]: s.remove(10);s
KeyError: 10

2. discard() 刪除給定元素,元素不存在什麼都不做

In [27]: s=set(range(10));s
Out[27]: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

In [29]: s.discard(4);s
Out[29]: {0, 1, 2, 3, 5, 6, 7, 8, 9}

In [30]: s.discard(10);s
Out[30]: {0, 1, 2, 3, 5, 6, 7, 8, 9}

3. pop() 隨機刪除一個元素並返回該元素

In [19]: s={0,1,2}

In [21]: s.pop()
Out[21]: 0

In [22]: s.pop()
Out[22]: 1

In [24]: s.pop()
Out[24]: 2

In [25]: s
Out[25]: set()

In [26]: s.pop()    //當集合為空時。報錯KeyError
KeyError: 'pop from an empty set'

4. clear() 清空集合

In [31]: s=set(range(10));s
Out[31]: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

In [32]: s.clear();s
Out[32]: set()

 

修改操作

集合不能修改單個元素

 

查詢操作

集合不是一個線性結構,所以集合不能通過索引查詢、集合也沒有順序、集合也沒有訪問單個元素的方法

 

集合運算

1. 交集運算

# intersection()求交集
In [1]: s1={1,2,3};s2={2,3,6}

In [2]: s1.intersection(s2)
Out[2]: {2, 3}

# intersection_update() 求交集並修改了s1
In [5]: s1.intersection_update(s2)

In [6]: print(s1,s2)
{2, 3} {2, 3, 6}

# set過載了‘&’作為求交集的運算子
In [9]: s1 & s2
Out[9]: {2, 3}

2. 差集運算

# difference() 
In [10]: s1={1,2,3};s2={2,3,6}

In [11]: s1.difference(s2)
Out[11]: {1}

In [12]: s2.difference(s1)
Out[12]: {6}

In [13]: print(s1,s2)
{1, 2, 3} {2, 3, 6}

# difference_update()
In [14]: s1.difference_update(s2)

In [15]: print(s1,s2)
{1} {2, 3, 6}

# set過載了‘-’作為求差集的運算子
In [17]: s1-s2
Out[17]: {1}

In [18]: s2-s1
Out[18]: {6}

3. 對稱差集=交集的補集

# symmetric_difference()求對稱差集
In [19]: s1={1,2,3};s2={2,3,6}

In [20]: s1.symmetric_difference(s2)
Out[20]: {1, 6}

# symmetric_difference_update()同理

# set過載了‘^’作為求對稱差集的運算子
In [26]: s1^s2
Out[26]: {1, 6}

4. 並集運算

# union()求並集
In [27]: s1={1,2,3};s2={2,3,6}

In [28]: s1.union(s2)
Out[28]: {1, 2, 3, 6}

# update()就是並集的uptdate版本
In [29]: s1.update(s2)

In [30]: print(s1,s2)
{1, 2, 3, 6} {2, 3, 6}

# set過載了‘|’作為求並集的運算子
In [2]: s1|s2
Out[2]: {1, 2, 3, 6}

 

集合相關的判斷

# A.issubset(B) 判斷A是否是B的子集
In [1]: s1={1,2,3,4};s2={2,3}

In [2]: s2.issubset(s1)
Out[2]: True

In [3]: s1.issubset(s2)
Out[3]: False

# A.issuperset(B) 判斷A是否是B的超集
In [4]: s1.issuperset(s2)
Out[4]: True

In [5]: s2.issuperset(s1)
Out[5]: False

# isdisjoint()判斷是否有交集,有交集返回False、無交集返回True
In [6]: s1={1,2,3,4};s2={2,3};s1.isdisjoint(s2)
Out[6]: False

In [8]: s3={1,2};s4={6,3};s3.isdisjoint(s4)
Out[8]: True

 

集合的應用

1.去重
2.成員運算子時的效率提高(參見博文《[PY3]——基本語法中成員運算子的內容》
3.場景一:有一個api它要有認證並且有一定許可權才可以訪問,例如要求滿足許可權A/B/C任意一項,有一個使用者具有許可權B、C、D,判斷該使用者是否有許可權訪問此API
4.場景二:有一個任務列表儲存全部的任務,有一個列表儲存已完成的任務,找出未完成的任務

 

集合的限制

總結來說:集合的元素必須是可Hash的(tuple、str、bytes等)

# list不可作為集合元素
In [10]: {[1,1,2],[6,6,8]}
TypeError: unhashable type: 'list'

# bytearray不可作為集合元素
In [11]: {bytearray(b'abc')}
TypeError: unhashable type: 'bytearray'

# set不可作為集合元素
In [12]: {{6,6,8}}
TypeError: unhashable type: 'set'

# tuple可作為集合元素
In [13]: {(3,1,3)}
Out[13]: {(3, 1, 3)}

# bytes可作為集合元素
In [14]: {b'abc'}
Out[14]: {b'abc'}

# str可以作為集合元素
In [15]: {'b','a'}
Out[15]: {'a', 'b'}

 

相關文章