鍍金池/ 教程/ Python/ 集合(2)
標準庫 (4)
如何成為 Python 高手
標準庫 (6)
標準庫 (3)
類(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習
列表(3)
從小工到專家
除法
錯誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準備
函數(shù)練習
標準庫 (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫一個簡單的程序
將數(shù)據(jù)存入文件
語句(5)
SQLite 數(shù)據(jù)庫
集成開發(fā)環(huán)境(IDE)
集合(1)
類(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語句(4)
錯誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標準庫 (1)
生成器
mysql 數(shù)據(jù)庫 (1)
第三方庫
實戰(zhàn)
運算符
類(3)
字典(2)
語句(1)
數(shù)和四則運算
語句(2)
文件(2)
MySQL 數(shù)據(jù)庫 (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫 (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫模塊
用 tornado 做網(wǎng)站 (1)
標準庫 (5)
函數(shù)(4)
類(5)
字符串(2)
關(guān)于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學函數(shù)和運算優(yōu)先級
字符串(3)
為計算做準備
多態(tài)和封裝
類(4)
迭代
語句(3)
錯誤和異常 (3)
分析 Hello
Python 安裝
標準庫 (2)
列表(2)
元組

集合(2)

不變的集合

《集合(1)》中以 set()來建立集合,這種方式所創(chuàng)立的集合都是可原處修改的集合,或者說是可變的,也可以說是 unhashable

還有一種集合,不能在原處修改。這種集合的創(chuàng)建方法是用 frozenset(),顧名思義,這是一個被凍結(jié)的集合,當然是不能修改了,那么這種集合就是 hashable 類型——可哈希。

>>> f_set = frozenset("qiwsir")
>>> f_set
frozenset(['q', 'i', 's', 'r', 'w'])
>>> f_set.add("python")             #報錯,不能修改,則無此方法
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'

>>> a_set = set("github")           #對比看一看,這是一個可以原處修改的 set
>>> a_set
set(['b', 'g', 'i', 'h', 'u', 't'])
>>> a_set.add("python")
>>> a_set
set(['b', 'g', 'i', 'h', 'python', 'u', 't'])

集合運算

喚醒一下中學數(shù)學(準確說是高中數(shù)學中的一點知識)中關(guān)于集合的一點知識,當然,你如果是某個理工科的專業(yè)大學畢業(yè),更應該熟悉集合之間的關(guān)系。

元素與集合的關(guān)系

就一種關(guān)系,要么術(shù)語某個集合,要么不屬于。

>>> aset
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> "a" in aset
False
>>> "h" in aset
True

集合與集合的關(guān)系

假設兩個集合 A、B

  • A 是否等于 B,即兩個集合的元素完全一樣

在交互模式下實驗

>>> a           
set(['q', 'i', 's', 'r', 'w'])
>>> b
set(['a', 'q', 'i', 'l', 'o'])
>>> a == b
False
>>> a != b
True
  • A 是否是 B 的子集,或者反過來,B 是否是 A 的超集。即 A 的元素也都是 B 的元素,但是 B 的元素比 A 的元素數(shù)量多。

判斷集合 A 是否是集合 B 的子集,可以使用 A<B,返回 true 則是子集,否則不是。另外,還可以使用函數(shù) A.issubset(B)判斷。

>>> a
set(['q', 'i', 's', 'r', 'w'])
>>> c
set(['q', 'i'])
>>> c<a     #c 是 a 的子集
True
>>> c.issubset(a)   #或者用這種方法,判斷 c 是否是 a 的子集
True
>>> a.issuperset(c) #判斷 a 是否是 c 的超集
True

>>> b
set(['a', 'q', 'i', 'l', 'o'])
>>> a<b     #a 不是 b 的子集
False
>>> a.issubset(b)   #或者這樣做
False
  • A、B 的并集,即 A、B 所有元素,如下圖所示

http://wiki.jikexueyuan.com/project/start-learning-python/images/11901.png" alt="" />

可以使用的符號是“|”,是一個半角狀態(tài)寫的豎線,輸入方法是在英文狀態(tài)下,按下"shift"加上右方括號右邊的那個鍵。找找吧。表達式是 A | B.也可使用函數(shù) A.union(B),得到的結(jié)果就是兩個集合并集,注意,這個結(jié)果是新生成的一個對象,不是將結(jié)合 A 擴充。

>>> a
set(['q', 'i', 's', 'r', 'w'])
>>> b
set(['a', 'q', 'i', 'l', 'o'])
>>> a | b                       #可以有兩種方式,結(jié)果一樣
set(['a', 'i', 'l', 'o', 'q', 's', 'r', 'w'])
>>> a.union(b)
set(['a', 'i', 'l', 'o', 'q', 's', 'r', 'w'])
  • A、B 的交集,即 A、B 所公有的元素,如下圖所示

http://wiki.jikexueyuan.com/project/start-learning-python/images/11902.png" alt="" />

>>> a
set(['q', 'i', 's', 'r', 'w'])
>>> b
set(['a', 'q', 'i', 'l', 'o'])
>>> a & b       #兩種方式,等價
set(['q', 'i'])
>>> a.intersection(b)
set(['q', 'i'])

我在實驗的時候,順手敲了下面的代碼,出現(xiàn)的結(jié)果如下,看官能解釋一下嗎?(思考題)

>>> a and b
set(['a', 'q', 'i', 'l', 'o'])
  • A 相對 B 的差(補),即 A 相對 B 不同的部分元素,如下圖所示

http://wiki.jikexueyuan.com/project/start-learning-python/images/11903.png" alt="" />

>>> a
set(['q', 'i', 's', 'r', 'w'])
>>> b
set(['a', 'q', 'i', 'l', 'o'])
>>> a - b
set(['s', 'r', 'w'])
>>> a.difference(b)
set(['s', 'r', 'w'])

-A、B 的對稱差集,如下圖所示

http://wiki.jikexueyuan.com/project/start-learning-python/images/11904.png" alt="" />

>>> a
set(['q', 'i', 's', 'r', 'w'])
>>> b
set(['a', 'q', 'i', 'l', 'o'])
>>> a.symmetric_difference(b)
set(['a', 'l', 'o', 's', 'r', 'w'])

以上是集合的基本運算。在編程中,如果用到,可以用前面說的方法查找。不用死記硬背。


總目錄   |   上節(jié):集合(1)   |   下節(jié):運算符

如果你認為有必要打賞我,請通過支付寶:qiwsir@126.com,不勝感激。

上一篇:除法下一篇:語句(1)