引言
set(集合)雖然用的很少,但它是一個無序的不重復元素序列,用來簡單的去重挺快的,
集合的定義
set(集合) 與串列類似,不同之處在于集合的 元素不重復- 集合和字典一樣也是用
{}定義,但元素之間使用,分隔,或者使用set()
{ } 定義
#!/usr/bin/python3
# -*- coding:utf-8 -*-
name_set = {'hui', 'wang', 'zack', 'hui'}
print(name_set) # 結果為 {'hui', 'wang', 'zack'}
name_set = set('hui', 'wang', 'zack', 'hui')
set() 定義
set() 只接受一個引數
In [13]: name_set = set('hui')
In [14]: name_set
Out[14]: {'h', 'i', 'u'}
In [15]: name_set = set(['hui', 'wang', 'zack', 'hui'])
In [16]: name_set
Out[16]: {'hui', 'wang', 'zack'}
注意:空集合不能用 s = {} 來定義這樣默認是字典,應該 s = set()
In [27]: s = {}
In [28]: s1 = set()
In [29]: type(s)
Out[29]: dict
In [30]: type(s1)
Out[30]: set
集合常用操作
集合所有內置方法如下:

方法太多我選幾個常用的測驗一下,
集合添加元素
使用 add() 即可向集合中添加元素
In [33]: s = set()
In [34]: s.add(1)
In [35]: s.add(4)
In [36]: s.add(3)
In [37]: s
Out[37]: {1, 3, 4}
In [38]: s.add(2)
In [39]: s
Out[39]: {1, 2, 3, 4}
集合移除元素
remove()移除集合中的元素,且如果元素不存在,會報錯discard()移除集合中的元素,且如果元素不存在,不會發生錯誤pop()隨機移除集合內的一個元素
In [38]: # remove() 移除
In [39]: s
Out[39]: {1, 2, 3, 4}
In [40]: s.remove(3)
In [41]: s
Out[41]: {1, 2, 4}
In [42]: s.remove(5)
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-42-9ec04578636f> in <module>
----> 1 s.remove(5)
KeyError: 5
In [45]: # discard() 移除
In [46]: s
Out[46]: {1, 2, 4}
In [47]: s.discard(4)
In [48]: s
Out[48]: {1, 2}
In [49]: s.discard(3)
In [50]: s
Out[50]: {1, 2}
In [56]: # pop() 隨機移除
In [57]: s.pop()
Out[57]: 1
In [58]: s
Out[58]: {2, 3, 9, 'hui'}
In [59]: s.pop()
Out[59]: 2
In [60]: s
Out[60]: {3, 9, 'hui'}
其實set 集合的 pop方法會將集合的左邊第一個元素進行洗掉,并回傳洗掉的元素,
集合統計、清空元素
len()統計集合元素個數clear()清空集合
In [68]: name_set
Out[68]: {'wang', 'zack'}
In [69]: len(name_set)
Out[69]: 2
In [71]: name_set.clear()
In [72]: len(name_set)
Out[72]: 0
In [73]: name_set
Out[73]: set()
集合元素獲取(遍歷)
集合不支持索引,也沒有方法進行獲取,因此只能采用
for ... in ...遍歷方式獲取元素,
In [81]: name_set
Out[81]: {'hui', 'wang', 'zack'}
In [82]: for name in name_set:
...: print(name)
...:
hui
wang
zack
In [83]: name_set[0]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-83-c0ead6d21f1d> in <module>
----> 1 name_set[0]
TypeError: 'set' object is not subscriptable
集合之間的運算
集合差運算 -
In [89]: a = {1, 2, 3, 4, 5}
In [90]: b = {1, 2, 3, 6}
In [91]: a - b
Out[91]: {4, 5}
In [92]: b - a
Out[92]: {6}
In [93]: a.difference(b)
Out[93]: {4, 5}
In [94]: b.difference(a)
Out[94]: {6}
a - b就相當于在a中去除跟b相同的元素b - a也就是在b中去除跟a相同的元素a - b等同于a.difference(b)
集合并運算 |
In [95]: a
Out[95]: {1, 2, 3, 4, 5}
In [96]: b
Out[96]: {1, 2, 3, 6}
In [97]: a | b
Out[97]: {1, 2, 3, 4, 5, 6}
集合交運算 &
In [99]: a
Out[99]: {1, 2, 3, 4, 5}
In [100]: b
Out[100]: {1, 2, 3, 6}
In [101]: a & b
Out[101]: {1, 2, 3}
集合異或運算 ^
In [102]: a
Out[102]: {1, 2, 3, 4, 5}
In [103]: b
Out[103]: {1, 2, 3, 6}
In [104]: a ^ b
Out[104]: {4, 5, 6}
把 a, b 集合中的相同元素都去掉,剩下的就是 ^ 異或運算的結果,
應用場景
普通for回圈去重
In [1]: li = [2, 1, 3, 6, 2, 1]
In [2]: temp = []
In [3]: for i in li:
...: if i not in temp:
...: temp.append(i)
...:
In [4]: li
Out[4]: [2, 1, 3, 6, 2, 1]
In [5]: temp
Out[5]: [2, 1, 3, 6]
利用集合簡單去重
In [106]: li = [1, 2, 2, 3, 3, 5]
In [107]: li = set(li)
In [108]: li
Out[108]: {1, 2, 3, 5}
In [109]: type(li)
Out[109]: set
In [110]:
這樣把原來的串列型別變成了集合型別,這樣更不好操作,這樣不是想要的結果,
因此要做到 去重加型別不變,只要再嵌套一個list() 即可
In [110]: li = [1, 2, 2, 3, 3, 5]
In [111]: li = list(set(li))
In [112]: li
Out[112]: [1, 2, 3, 5]
In [113]: type(li)
Out[113]: list
In [114]:
去重保持原來的順序
使用 sort + set 去重
In [6]: list1 = [2, 1, 3, 6, 2, 1]
In [7]: list2 = list(set(list1))
In [8]: list2
Out[8]: [1, 2, 3, 6]
In [9]: list2.sort(key=list1.index)
In [10]: list2
Out[10]: [2, 1, 3, 6]
使用 sorted + set 去重
In [12]: list1 = [2, 1, 3, 6, 2, 1]
In [13]: temp = sorted(set(list1), key=list1.index)
In [14]: temp
Out[14]: [2, 1, 3, 6]
尾語
? 用 Code 譜寫世界,讓生活更有趣,??
? 萬水千山總是情,點贊再走行不行,??
? 碼字不易,還望各位大俠多多支持,??

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/301053.html
標籤:python
