集合是一個無序的,不重複的數據組合,主要的作用如下

  • 去重,把一個列表變成集合,就會自動去重了。
  • 關係測試,測試二組數據之前的交集、差集、聯集等關係。

接下來我們來實作看看什麼是去重

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) print(list_1, type(list_1)) ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} <class 'set'> Process finished with exit code 0

觀察一下,發現原本有重複出現的數字已經不見了,而且這個列表也已經變成一個集合了

接下來我們來試試關係測試

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_2 = set([0, 2, 6, 66, 22, 8, 4]) print(list_1, list_2) ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} {0, 2, 66, 4, 6, 8, 22} Process finished with exit code 0

觀察上面代碼,這二個集合中,有沒有二個一樣的數字?那如何將這二個一樣的數字給取出來呢?

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_2 = set([0, 2, 6, 66, 22, 8, 4]) print(list_1, list_2) print(list_1.intersection(list_2)) # 交集 ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} {0, 2, 66, 4, 6, 8, 22}
{4, 6} Process finished with exit code 0

唔…成功取出來了,{4, 6}就是這二個集合的交集,所謂交集就是二個集合裡面都有的東西,A和B的交集寫作A ∩ B

如果做二個集合的聯集要怎麼取呢?

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_2 = set([0, 2, 6, 66, 22, 8, 4]) print(list_1, list_2) print(list_1.union(list_2)) # 聯集 ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} {0, 2, 66, 4, 6, 8, 22}
{0, 1, 2, 3, 4, 5, 6, 7, 66, 9, 8, 22} Process finished with exit code 0

唔…在觀察一下,發現這二個集合被合併成一個集合了,並且也做了去重,這個就叫做聯集, A和B的聯集通常寫作 A ∪ B

如果做二個集合的差集要怎麼取呢?

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_2 = set([0, 2, 6, 66, 22, 8, 4]) print(list_1, list_2) print(list_1.difference(list_2)) # 差集 in list_1 but not in list_2 ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} {0, 2, 66, 4, 6, 8, 22}
{1, 3, 5, 9, 7} Process finished with exit code 0

觀察一下,可以想像成把list_1這個集合減去list_1跟list_2的交集,就會是list_1的差集了,那…list_2的差集會是長什麼樣子呢?

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_2 = set([0, 2, 6, 66, 22, 8, 4]) print(list_1, list_2) print(list_1.difference(list_2)) # 差集 in list_1 but not in list_2
print(list_2.difference(list_1)) ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} {0, 2, 66, 4, 6, 8, 22}
{1, 3, 5, 9, 7}
{0, 8, 2, 66, 22} Process finished with exit code 0

唔…在仔細觀察一下,list_2的差集有什麼不同!是不是也發現{4, 6}這二個數字也不見了,只保留了{0, 8, 2, 66, 22}

除了這三個之外,還有沒有別的關係?是有的

接下來我們來試試子集

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_2 = set([0, 2, 6, 66, 22, 8, 4]) print(list_1, list_2) print(list_1.issubset(list_2)) # 子集 ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} {0, 2, 66, 4, 6, 8, 22}
False Process finished with exit code 0

咦,出現False,為什麼會出現false呢?

是因為list_1這個集合裡的數字,沒有完全符合list_2這個集合裡的數字,所以才會是False,那有子集就會有父集,那就來試試看list_2是不是list_1的父集?

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_2 = set([0, 2, 6, 66, 22, 8, 4]) print(list_1, list_2) print(list_1.issubset(list_2)) # 子集
print(list_2.issuperset(list_1)) # 父集 ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} {0, 2, 66, 4, 6, 8, 22}
False
False Process finished with exit code 0

接下來我們來新增一個集合list_3,再試試剛剛那個子集父集,觀察一下,有什麼不同?

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_2 = set([0, 2, 6, 66, 22, 8, 4])
list_3 = set([1, 3, 7]) print(list_1, list_2, list_3) print(list_3.issubset(list_1)) # 子集
print(list_1.issuperset(list_3)) # 父集 ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} {0, 2, 66, 4, 6, 8, 22} {1, 3, 7}
True
True Process finished with exit code 0

唔…list_3list_1的子集,反過來說,list_1list_3父集

再來試試對稱差集,觀察一下看看有什麼不同

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_2 = set([0, 2, 6, 66, 22, 8, 4])
list_3 = set([1, 3, 7]) print(list_1, list_2, list_3) print(list_1.symmetric_difference(list_2)) ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} {0, 2, 66, 4, 6, 8, 22} {1, 3, 7}
{0, 1, 2, 66, 3, 5, 7, 8, 9, 22} Process finished with exit code 0

唔,就是把二個集合裡所沒有的元素給取出來,所以就取出了{0, 1, 2, 66, 3, 5, 7, 8, 9, 22},而{4, 6}是這二個集合都有的,所以就不取了

再來我們在新增一個集合叫list_4,當二個集合沒有交集的話,要怎麼判斷?

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_2 = set([0, 2, 6, 66, 22, 8, 4])
list_3 = set([1, 3, 7])
list_4 = set([5, 6, 8]) print(list_1, list_2, list_3) print(list_3.isdisjoint(list_4)) # Return True if two sets have a null intersection. ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} {0, 2, 66, 4, 6, 8, 22} {1, 3, 7}
True Process finished with exit code 0

唔,有發現結果回應True,就代表set.isdisjoint()判斷當二個集合沒有交集時,就返回True,那我在修改一下list_4,在觀察一下

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_2 = set([0, 2, 6, 66, 22, 8, 4])
list_3 = set([1, 3, 7])
list_4 = set([5, 6, 7, 8]) print(list_1, list_2, list_3) print(list_3.isdisjoint(list_4)) ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} {0, 2, 66, 4, 6, 8, 22} {1, 3, 7}
False Process finished with exit code 0

嗯!結果返回一個False,就代表list_3list_4是有交集

用符號來表示交集聯集差集對稱差集

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_2 = set([0, 2, 6, 66, 22, 8, 4])
list_3 = set([1, 3, 7])
list_4 = set([5, 6, 7, 8]) print(list_1, list_2, list_3) print(list_1 & list_2) # 交集(intersection)
print(list_1 | list_2) # 聯集(Union)
print(list_1 - list_2) # 差集(difference) in list_1 not in list_2
print(list_1 ^ list_2) # 對稱差集(symmetric_difference) ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9} {0, 2, 66, 4, 6, 8, 22} {1, 3, 7}
{4, 6}
{0, 1, 2, 3, 4, 5, 6, 7, 66, 9, 8, 22}
{1, 3, 5, 9, 7}
{0, 1, 2, 66, 3, 5, 7, 8, 9, 22} Process finished with exit code 0

再來我們來操作集合的新增、修改、刪除,先試試對一個集合做新增

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_1.add(44)
print(list_1) ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 9, 44} Process finished with exit code 0

再來新增多個數字到集合裡

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_1.add(44)
list_1.update([9527, 520, 1314])
print(list_1) ---------------執行結果--------------- {1, 1314, 3, 4, 5, 6, 7, 520, 9, 44, 9527} Process finished with exit code 0

再來試試刪除的方法

Method 1: set.remove() 刪除元素,但刪除一個不存在的元素,會噴error

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_1.add(44)
list_1.update([9527, 520, 1314])
list_1.remove(1314)
print(list_1) ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 520, 9, 44, 9527} Process finished with exit code 0

Method 2: set.pop() 隨機任意刪,並且打印出刪除的元素

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_1.add(44)
list_1.update([9527, 520, 1314])
list_1.remove(1314)
print(list_1)
print(list_1.pop())
print(list_1.pop())
print(list_1.pop())
print(list_1.pop())
print(list_1.pop())
print(list_1.pop())
print(list_1.pop())
print(list_1) ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 520, 9, 44, 9527}
1
3
4
5
6
7
520
{9, 44, 9527} Process finished with exit code 0

Method 3: set.discard() 如果元素存在,就刪除,元素不存在,也不會噴error

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_1.add(44)
list_1.update([9527, 520, 1314])
list_1.remove(1314)
print(list_1) list_1.discard(9)
list_1.discard(999) # 故意刪除一個不存在的,也不會報錯
print(list_1) ---------------執行結果--------------- {1, 3, 4, 5, 6, 7, 520, 9, 44, 9527}
{1, 3, 4, 5, 6, 7, 520, 44, 9527} Process finished with exit code 0

計算集合的長度

#!/usr/bin/env python3
# -*- coding:utf-8 -*- list_1 = [1, 4, 5, 7, 3, 6, 7, 9]
list_1 = set(list_1) list_1.add(44)
list_1.update([9527, 520, 1314])
list_1.remove(1314)
print(len(list_1))
print(list_1) ---------------執行結果--------------- 10
{1, 3, 4, 5, 6, 7, 520, 9, 44, 9527} Process finished with exit code 0

參考資料:

Python 基礎 - 集合的使用的更多相关文章

  1. Python 基礎 - for流程判斷

    今天介紹另一個循環判斷式 for循環,首先,先寫一個很簡單的 for循環的代碼 #!/usr/bin/env python3 # -*- coding:utf-8 -*- for i in range ...

  2. Python 基礎 - if else流程判斷

    hmm~前面講了那麼多,終於可以稍稍的正式進入另一個階段,沒錯,要開始寫判斷式了 這次先從最簡單的判斷式開始,if else 開始- Go 首先,之前有寫有一個簡單的互動式 用戶輸入 的代碼,忘記了嗎 ...

  3. Python 基礎 - 數據類型

    標準數據類型 Python3 中有六個標準的數據類型 1 Number(數字) 2 String(字符串) 3 List (列表) 4 Tuple (元組) 5 Sets (集合) 6 Diction ...

  4. Python 基礎 - 字符編碼

    Python 解釋器在加載 .py 文件中的代碼時,會對內容進行編碼 (默認 ascill) ASCII (American Standard Code for Information Interch ...

  5. Python 基礎 - pyc 是什麼

    Python2.7 版中,只要執行 .py 的檔案後,即會馬上產生一個 .pyc 的檔案,而在 Python3 版中,執行 .py 的檔案後,即會產生一個叫 __pycache__ 的目錄,裡面也會有 ...

  6. Python 基礎 - 字符轉編碼操作

    回顧字符編碼的前世今生 ASCII 只能儲英文或特殊字符,只占一個字節,一個字節8bit,不能儲中文,所以才出現Unicode Unicode 不管是中文或英文,都是占二個字節,一個字節8bit UT ...

  7. Python 基礎 - 文件操作_v2

    嗯,那如何要把游標的位置給打印來? #!/usr/bin/env python3 # -*- coding:utf-8 -*- f = open('test', 'r') print(f.tell() ...

  8. Python 基礎 - 文件的操作

    在來我們來玩一下文件操作,這個在未來工作上,也是會很常用到的功能 Python2.7中,可以用file()來打開文件,而在Python3中,一律都是用open(),接下來在當前目錄下,先建立一個空文件 ...

  9. Python 基礎 - 字典的操作使用

    接下來介紹字典,這在未來工作上,會是很常使用的,就來好好了解一下唄- 字典是一個 key(鍵)-value(值) 的數據類型,可以儲存很多訊息 #!/usr/bin/env python3 # -*- ...

随机推荐

  1. 简易线程池Thread Pool

    1. 基本思路 写了个简易的线程池,基本的思路是: 有1个调度线程,负责维护WorkItem队列.管理线程(是否要增加工作线程).调度(把工作项赋给工作线程)等 线程数量随WorkItem的量动态调整 ...

  2. 【转】2014年25款最好的jQuery插件

    2014年25款最好的jQuery插件 来源:Specs' Blog-就爱PHP   时间:2014-12-30 10:24:10   阅读数:2267 分享到: 0 http://www.php10 ...

  3. MRPT笔记——MRPT在VS2013中的配置

    Mobile Robot Programming Toolkit (MRPT)是一个跨平台的.开源的C++库,旨在帮助机器人研究员设计和实现SLAM.机器视觉和运动规划(避障)的算法. MRPT为移动 ...

  4. SpringMVC与MyBatis整合(一)——查询人员列表

    从今天开始,一点点的记录做毕设和学习的过程. 寒假才开始接触SpringMVC和MyBatis,之前对框架的概念理解并不到位,也没学过Spring.目前学习起来思路并不很清晰,有些东西我还不能理解,只 ...

  5. C# UdpClient使用Receive和BeginReceive接收消息时的不同写法

    使用Receive(同步阻塞方式), 注意使用同步方法时,需要使用线程来开始方法,不然会使UI界面卡死 IPEndPoint RemoteIpEndPoint = ); UdpClient udpCl ...

  6. php类的__get和__set方法

    (1)这两个方法是自动调用的 (2)这两个方法只有在成员变量是private的时候才会自己调用 testclass.php <?php class testclass { private $va ...

  7. python 中的高级函数reduce()

    reduce()函数也是Python内置的一个高阶函数.reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收 ...

  8. google 账号登陆chrome内容是中文的问题

    最近要用到google accout使用某项服务,奇怪的是之前是英文,登陆后就显示中文了,我把浏览器默认的语言和电脑的系统语言改了也无济于事,最好还是google 帮忙解决了,原来我的google a ...

  9. .Net中使用com组件后发生System.ArithmeticException异常的解决办法(Message=算术运算中发生溢出或下溢。)

    最近在开发一个.Net程序,其中涉及到对com组件的调用,或者第三方DLL调用, 在调用完以后如果使用一些小的测试程序继续运行,一切正常,但是在使用带有GUI的form程序,或者WPF程序中,继续执行 ...

  10. 将excel文件批量转成pdf

    防止数据编辑.改动带来的不一致性,常常要将excel文件转成pdf文件再共享.发送给对方.有时excel文件还挺多,手头上保存实在是太慢了.就考虑用VBA批量转置. 掌握几个东西,就比较容易了: 1. ...