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