1. 程式人生 > >python學習筆記(五)集合(set)

python學習筆記(五)集合(set)

set 擁有類似 dict 的特點:可以用{}花括號來定義;其中的元素沒有序列,也就是是非序列型別的資料;而且,set 中的元素不可重複,這就類似 dict 的鍵.

set 也有一點 list 的特點:有一種集合可以原處修改.

下面通過實驗,進一步理解建立 set 的方法:

>>> s1 = set("qiwsir")  
>>> s1                  
set(['q', 'i', 's', 'r', 'w'])

把 str 中的字元拆解開,形成 set.特別注意觀察:qiwsir 中有兩個 i,但是在 s1 中,只有一個 i,也就是集合中元素不能重複。

>>> s2 = set([123,"google","face","book","facebook","book"])
>>> s2
set(['facebook', 123, 'google', 'book', 'face'])                

在建立集合的時候,如果發現了重複的元素,就會過濾一下,剩下不重複的。而且,從 s2 的建立可以看出,檢視結果是顯示的元素順序排列與開始建立是不同,完全是隨意顯示的,這說明集合中的元素沒有序列。

>>> s3 = {"facebook",123}       #通過{}直接建立
>>> s3
set([123, 'facebook'])

然後用 help()可以找到每個函式的具體使用方法,下面列幾個例子:

add, update

>>> help(set.add)

Help on method_descriptor:

add(...)
Add an element to a set.  
This has no effect if the element is already present.

下面在互動模式這個最好的實驗室裡面做實驗:

>>> a_set = {}              #我想當然地認為這樣也可以建立一個 set
>>> a_set.add("qiwsir")     #報錯.看看錯誤資訊,居然告訴我 dict 沒有 add.我分明建立的是 set 呀.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'add'
>>> type(a_set)             #type 之後發現,計算機認為我建立的是一個 dict     
<type 'dict'>

特別說明一下,{}這個東西,在 dict 和 set 中都用.但是,如上面的方法建立的是 dict,不是 set.這是 Python 規定的.要建立 set,只能用前面介紹的方法了.

>>> a_set = {'a','i'}       #這回就是 set 了吧
>>> type(a_set)
  <type 'set'>              #果然

>>> a_set.add("qiwsir")     #增加一個元素
>>> a_set                   #原處修改,即原來的 a_set 引用物件已經改變
set(['i', 'a', 'qiwsir'])

>>> b_set = set("python")
>>> type(b_set)
<type 'set'>
>>> b_set
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> b_set.add("qiwsir")
>>> b_set
set(['h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])

>>> b_set.add([1,2,3])      #報錯.list 是不可雜湊的,集合中的元素應該是 hashable 型別。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

>>> b_set.add('[1,2,3]')    #可以這樣!
>>> b_set
set(['[1,2,3]', 'h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])

除了上面的增加元素方法之外,還能夠從另外一個 set 中合併過來元素,方法是 set.update(s2)

>>> help(set.update)
update(...)
    Update a set with the union of itself and others.

>>> s1
set(['a', 'b'])
>>> s2
set(['github', 'qiwsir'])
>>> s1.update(s2)       #把 s2 的元素併入到 s1 中.
>>> s1                  #s1 的引用物件修改
set(['a', 'qiwsir', 'b', 'github'])
>>> s2                  #s2 的未變
set(['github', 'qiwsir'])

pop, remove, discard, clear

>>> help(set.pop)
pop(...)
    Remove and return an arbitrary set element.
    Raises KeyError if the set is empty.

>>> b_set
set(['[1,2,3]', 'h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])
>>> b_set.pop()     #從 set 中任意選一個刪除,並返回該值
'[1,2,3]'
>>> b_set.pop()
'h'
>>> b_set.pop()
'o'
>>> b_set
set(['n', 'p', 't', 'qiwsir', 'y'])

>>> b_set.pop("n")  #如果要指定刪除某個元素,報錯了.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pop() takes no arguments (1 given)

set.pop()是從 set 中任意選一個元素,刪除並將這個值返回.但是,不能指定刪除某個元素.報錯資訊中就告訴我們了,pop()不能有引數.此外,如果 set 是空的了,也報錯.這條是幫助資訊告訴我們的,看官可以試試.

要刪除指定的元素,怎麼辦?

>>> help(set.remove)

remove(...)
    Remove an element from a set; it must be a member.    

    If the element is not a member, raise a KeyError.

set.remove(obj)中的 obj,必須是 set 中的元素,否則就報錯.試一試:

>>> a_set
set(['i', 'a', 'qiwsir'])
>>> a_set.remove("i")
>>> a_set
set(['a', 'qiwsir'])
>>> a_set.remove("w")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'w'

跟 remove(obj)類似的還有一個 discard(obj):

>>> help(set.discard)

discard(...)
    Remove an element from a set if it is a member.

    If the element is not a member, do nothing.

help(set.remove)的資訊對比,看看有什麼不同.discard(obj)中的 obj 如果是 set 中的元素,就刪除,如果不是,就什麼也不做,do nothing.新聞就要對比著看才有意思呢.這裡也一樣.

>>> a_set.discard('a')
>>> a_set       
set(['qiwsir'])
>>> a_set.discard('b')
>>>

在刪除上還有一個絕殺,就是 set.clear(),它的功能是:Remove all elements from this set.(看官自己在互動模式下 help(set.clear))

>>> a_set
set(['qiwsir'])
>>> a_set.clear()
>>> a_set
set([])
>>> bool(a_set)     #空了,bool 一下返回 False.
False

集合運算

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

元素與集合的關係

就一種關係,要麼術語某個集合,要麼不屬於。

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

集合與集合的關係

假設兩個集合 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 的元素數量多。

判斷集合 A 是否是集合 B 的子集,可以使用 A<B,返回 true 則是子集,否則不是。另外,還可以使用函式 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 所有元素,如下圖所示

可以使用的符號是“|”,是一個半形狀態寫的豎線,輸入方法是在英文狀態下,按下"shift"加上右方括號右邊的那個鍵。找找吧。表示式是 A | B.也可使用函式 A.union(B),得到的結果就是兩個集合並集,注意,這個結果是新生成的一個物件,不是將結合 A 擴充。

>>> a
set(['q', 'i', 's', 'r', 'w'])
>>> b
set(['a', 'q', 'i', 'l', 'o'])
>>> a | b                       #可以有兩種方式,結果一樣
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 所公有的元素,如下圖所示

>>> 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'])

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

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

>>> 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 的對稱差集,如下圖所示

>>> 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'])

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


相關推薦

python學習筆記集合(set)

set 擁有類似 dict 的特點:可以用{}花括號來定義;其中的元素沒有序列,也就是是非序列型別的資料;而且,set 中的元素不可重複,這就類似 dict 的鍵. set 也有一點 list 的特點:有一種集合可以原處修改. 下面通過實驗,進一步理解建立 set 的方法:

Python學習筆記OOP

默認 tro acl 引入 支持 不同 post set 成像 模塊 使用模塊import 模塊名。有的僅僅導入了某個模塊的一個類或者函數,使用from 模塊名 import 函數或類名實現。為了避免模塊名沖突。Python引入了按文件夾來組織模塊的方

python學習筆記數值類型和類型轉換

學習 系統 oat cal 關於 trac hide sed lin Python中的數值類型有:   整型,如2,520   浮點型,如3.14159,1.5e10   布爾類型 True和False e記法:   e記法即對應數學中的科學記數法 1 >>

python學習筆記

推導式 for mod cal pos [] 類名 left 開頭 38、繼承 子類繼承父類時,如果不寫init方法,表示繼承父類的init方法。如果寫了init方法,表示重寫父類的init方法。其他方法也是同理。對於變量也是同樣的道理。 class A: def __in

Python學習筆記變數的命名

一、識別符號 識別符號就是程式設計師定義的變數名、函式名 名字 需要有 見名知義的效果   識別符號可以由 字母、下劃線和數字組成 不能以數字開頭 不能與關鍵字重名   二、關鍵字 關鍵字就是pyt

Python 學習筆記[面向物件]

變數 類的變數 class A: num = 1 a = A() # 1 a.num # 1 A.num # 修改類的變數值 A.num = 2 # 2 a.num # 修改物件的變數值 a.num = 3 2 A.num # 給物件新增屬性 a.age

Python學習筆記猜數字遊戲while

今天寫的是一個猜數字遊戲,我記得好像大二還是大三的時候在日方課上用vb實現過,大體思想就是先生成一個隨機數,然後進行輸入,程式會判斷你輸入的值和隨機值相比較的結果,一直到你輸入正確才退出迴圈體。 關於隨機數的應用,首先要引入random類,程式中生成的是1到10的隨機

Python學習筆記-- 上下文管理器Context Manager

定義 如何使用 如何建立 1.定義 寫程式碼時,我們希望把一些操作放到一個程式碼塊中,這樣在程式碼塊中執行時就可以保持在某種執行狀態,而當離開該程式碼塊時就執行另一個操作,結束當前狀態;所以,簡單來說,上下文管理器的目的就是規定物件的

多分類例項:鳶尾花分類-基於keras的python學習筆記

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/weixin_44474718/article/details/86420803 資料集可以從UCI機器學習倉庫下載(http://archive.ics.uci.edu/ml/datasets

python學習筆記——輸入和輸出

第六章 輸入和輸出 #第六章 輸入和輸出 #6.1 輸入和輸出概述 #實現互動功能的方式:a命令列引數 b標準輸入和輸出函式 c檔案輸入和輸出 d圖形化使用者介面 #6.2 命令列引數 #6.2.1 sys.argv與命令列引數 # import sys,random

Python學習筆記-- Python字串

一、Python字串  1、字串是 Python 中最常用的資料型別。我們可以使用引號('或")來建立字串。建立字串很簡單,只要為變數分配一個值即可。例如:         var1 = 'Hello

python學習筆記-- 深拷貝、淺拷貝

end 另一個 rem remove xiaomi pri epc code 變量 深拷貝--兩個變量指向不同內存地址L1 = [1,2,3,4,5]L2 = L1[:]#深拷貝淺拷貝--兩個變量指向同一內存地址L3 = L1#淺拷貝 #循環list的時候,不要刪除元

Python學習筆記——字符串

1.2 size 引號 python3 操作 可選 原因 vpd 出現 字符串 Python字符串——一個有序字符的集合,用於存儲和表現基於文本的信息。 Python中沒有單個字符的類型,只有使用一個字符的字符串。 字符串被劃分為不可變序列,意味著這些字符串所包含的字符存在

流暢的python和cookbook學習筆記

pytho col () 學習 util 學習筆記 取出 minute python 1.隨機選擇   python中生成隨機數使用random模塊。   1.從序列中隨機挑選元素,使用random.choice() >>> import random

python學習筆記集合1

什麽 mos pty this ash 筆記 sca sel 指定 python學習筆記(六)之集合1python中各種類型與其各種方法,都可以使用下面的方法查到:(1)交互模式下用dir()或者help()(2)google集合特點:英語set,有的可變,有的不可變;元素

python學習筆記集合2

lock true 可變 對象 屬於 attribute 聯盟 per rec python學習筆記(七)之集合2不變的集合在”python學習筆記(六)之集合1“中以set()來建立集合,這種方式所創建的集合都是可原地修改的集合,或者說是可變的,也就是說是unhashab

Scala學習筆記—— 對映、元祖、集合

1. 對映 對映Java中的Map,即Key/Value的資料形式 對映的建立,有以下兩種方法 1 scala> val map =Map("Lisa" -> 90 , "Hellen" -> 89) 2 map: scala.collection.immutabl

Python + OpenCV 學習筆記>>> 畫素運算

1. 算數運算 注意:兩幅影象的畫素大小要一致 進行影象畫素之間的算術運算,首先要匯入影象,讀取其中資訊: m1 = cv.imread("/home/pi/Desktop/m1.jpg") m2 = cv.imread("/home/pi/Desktop/m2.jpg")

Spark (Python版) 零基礎學習筆記—— Spark RDDs程式設計

RDD基礎概念 建立RDD 建立RDD的方法: 1.載入外部資料集 2.分佈一個物件的集合 前邊幾次的筆記已經提到過多次了,因此,這裡只列出幾個注意事項: 1.利用sc.parallelize建立RDD一般只適用於在測試的時候使用,因為這需要我們將整

python基礎學習筆記裝飾器,高階函式

多程序程式設計import multiprocessing def process1(): return 1 def process2(): return 2 p1=multiprocessing.Process(target=process1) p2=m