14.python中的集合

来源:http://www.cnblogs.com/scolia/archive/2016/05/30/5540453.html
-Advertisement-
Play Games

什麼是集合?正如其字面的意思,一堆東西集中合併到一起。乍一聽貌似和容器沒什麼差別,嗯,好吧,集合也算是一種容器。 在學習這個容器有什麼不同之前,先看看集合是如何創建的: 集合分為兩種,一種是不可變的,一種是可變的,兩者的差異後面會分析。 不過,我們創建了兩個空的集合貌似麽什麼意思。 為了使其有意義, ...


  什麼是集合?正如其字面的意思,一堆東西集中合併到一起。乍一聽貌似和容器沒什麼差別,嗯,好吧,集合也算是一種容器。

  在學習這個容器有什麼不同之前,先看看集合是如何創建的:

a = set()   #不可變集合
b = frozenset() #可變集合
print a
print b

  

  集合分為兩種,一種是不可變的,一種是可變的,兩者的差異後面會分析。

  不過,我們創建了兩個空的集合貌似麽什麼意思。

  為了使其有意義,我們就先來看集合最重要的功能:去重

a = ('aaa',123,123,123)
b = set(a)
print b

  可以看到元祖a中的重覆的元素123在集合中只剩下一個了。所以,我們總結集合的概念:

  集合就是將不同的元素放在一起組成一個集合對象。(不影響原來的對象)

  此時,有機智的同學看到集合裡面有個方括弧,立馬想到了列表,並試圖用索引來取值:

a = ('aaa',123,123,123)
b = set()
print b[0]

  然而並不可以。

  因為集合是無序的,和字典一樣。

  那麼是否我們可以將集合看作是一種特殊的字典,只不過沒有鍵,所以不能通過鍵去取值而已

  某種意義上是可以的,不過要註意,集合分為可變集合和不可變集合兩種,不可變的集合就不能像字典一樣修改元素。

  另外補充一點:

a = 'abcdaabbccdd'
b = set(a)
print b

  因為字元串也是序列,所以也可以用來去重,但是一般沒什麼用就是。

  那麼,對字典去重會怎麼樣?我們在字典中瞭解到了字典會自動處理鍵名重覆的問題,那麼值能進行去重嗎?

a = {'a':123,'b':123}
b = set(a)
print b

  看來還是對鍵的去重,並沒有什麼用,除非要將所以的鍵組合成一個集合,其去重意義不大。看業務需要吧。

  這裡,我對去重的總結是:去除重覆的引用,相信看過我在python序列中的說明的人能明白這是什麼意思。

  知道去重的本質之後,我們有這個需求,我有兩個容器,我想得到這兩個容器去重後的結果。

  那我這樣寫:

a = ('scolia',123,456,666)
b = ('scolia',666)
c = set(a,b)
print c

  結果是大紅字甩臉,說只要一個參數,結果給了兩個。

  好吧,首先看看其內部是怎麼接受參數的:

  首先,這裡的__init__是構造函數,在類的創建時會講。現在只要知道我們的參數是傳給 seq=() 的,而按照這裡的寫法,應該是可以傳一個元祖的。

  那麼是不是就可以這樣寫:

a = ('scolia',123,456,666)
b = ('scolia',666)
c = set((a,b))
print c

  傳是傳進去了,但結果並不是我們想象的那樣。

  看來集合的去重是針對一個對象的,那麼我們就可以將集合總結成:

  集合是去除一個對象(序列或類序列的字典)中,元素的重覆引用的。

  所以我們想要實現這個需要,首先要將兩個對象拼接起來:

a = ('scolia',123,456,666)
b = ('scolia',666)
c = set(a+b)
print c

 

  關於序列的拼接不只一種,詳情看我之前的博文。

  而不同類型的序列先要強制轉換成一種,否則報錯

a = ('scolia',123,456,666)
b = ['scolia',666]
c = set(a+tuple(b))
print c

 

  下麵我們來開始學習其內置方法吧。


  老辦法,先看看幫助文檔。

  因為集合分為可變和不可變的,所以將分開說明:

Help on class set in module __builtin__:

class set(object)
 |  set() -> new empty set object
 |  set(iterable) -> new set object
 |  
 |  Build an unordered collection of unique elements.
 |  
 |  Methods defined here:
 |  
 |  __and__(...)
 |      x.__and__(y) <==> x&y
 |  
 |  __cmp__(...)
 |      x.__cmp__(y) <==> cmp(x,y)
 |  
 |  __contains__(...)
 |      x.__contains__(y) <==> y in x.
 |  
 |  __eq__(...)
 |      x.__eq__(y) <==> x==y
 |  
 |  __ge__(...)
 |      x.__ge__(y) <==> x>=y
 |  
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |  
 |  __gt__(...)
 |      x.__gt__(y) <==> x>y
 |  
 |  __iand__(...)
 |      x.__iand__(y) <==> x&=y
 |  
 |  __init__(...)
 |      x.__init__(...) initializes x; see help(type(x)) for signature
 |  
 |  __ior__(...)
 |      x.__ior__(y) <==> x|=y
 |  
 |  __isub__(...)
 |      x.__isub__(y) <==> x-=y
 |  
 |  __iter__(...)
 |      x.__iter__() <==> iter(x)
 |  
 |  __ixor__(...)
 |      x.__ixor__(y) <==> x^=y
 |  
 |  __le__(...)
 |      x.__le__(y) <==> x<=y
 |  
 |  __len__(...)
 |      x.__len__() <==> len(x)
 |  
 |  __lt__(...)
 |      x.__lt__(y) <==> x<y
 |  
 |  __ne__(...)
 |      x.__ne__(y) <==> x!=y
 |  
 |  __or__(...)
 |      x.__or__(y) <==> x|y
 |  
 |  __rand__(...)
 |      x.__rand__(y) <==> y&x
 |  
 |  __reduce__(...)
 |      Return state information for pickling.
 |  
 |  __repr__(...)
 |      x.__repr__() <==> repr(x)
 |  
 |  __ror__(...)
 |      x.__ror__(y) <==> y|x
 |  
 |  __rsub__(...)
 |      x.__rsub__(y) <==> y-x
 |  
 |  __rxor__(...)
 |      x.__rxor__(y) <==> y^x
 |  
 |  __sizeof__(...)
 |      S.__sizeof__() -> size of S in memory, in bytes
 |  
 |  __sub__(...)
 |      x.__sub__(y) <==> x-y
 |  
 |  __xor__(...)
 |      x.__xor__(y) <==> x^y
 |  
 |  add(...)
 |      Add an element to a set.
 |      
 |      This has no effect if the element is already present.
 |  
 |  clear(...)
 |      Remove all elements from this set.
 |  
 |  copy(...)
 |      Return a shallow copy of a set.
 |  
 |  difference(...)
 |      Return the difference of two or more sets as a new set.
 |      
 |      (i.e. all elements that are in this set but not the others.)
 |  
 |  difference_update(...)
 |      Remove all elements of another set from this set.
 |  
 |  discard(...)
 |      Remove an element from a set if it is a member.
 |      
 |      If the element is not a member, do nothing.
 |  
 |  intersection(...)
 |      Return the intersection of two or more sets as a new set.
 |      
 |      (i.e. elements that are common to all of the sets.)
 |  
 |  intersection_update(...)
 |      Update a set with the intersection of itself and another.
 |  
 |  isdisjoint(...)
 |      Return True if two sets have a null intersection.
 |  
 |  issubset(...)
 |      Report whether another set contains this set.
 |  
 |  issuperset(...)
 |      Report whether this set contains another set.
 |  
 |  pop(...)
 |      Remove and return an arbitrary set element.
 |      Raises KeyError if the set is empty.
 |  
 |  remove(...)
 |      Remove an element from a set; it must be a member.
 |      
 |      If the element is not a member, raise a KeyError.
 |  
 |  symmetric_difference(...)
 |      Return the symmetric difference of two sets as a new set.
 |      
 |      (i.e. all elements that are in exactly one of the sets.)
 |  
 |  symmetric_difference_update(...)
 |      Update a set with the symmetric difference of itself and another.
 |  
 |  union(...)
 |      Return the union of sets as a new set.
 |      
 |      (i.e. all elements that are in either set.)
 |  
 |  update(...)
 |      Update a set with the union of itself and others.
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  __hash__ = None
 |  
 |  __new__ = <built-in method __new__ of type object>
 |      T.__new__(S, ...) -> a new object with type S, a subtype of T
set

 

  可分為以下幾類:

  1.運算符相關

  3.內置函數相關(以後總結)

  4.普通內置方法

 


1.運算符相關

  不知道你是否還記得數學中的集合,就是那個交集、補集什麼的,忘記了請自己重修。

下麵用一個表格總結:

數學符號 python符號 說明
 ∩  & 交集,如a&b
 ∪  | 並集,如a|b
 - 或 \  - 差補或相對補集
 △  ^ 對稱差分
 ⊂  < 真子集
 ⊆  <= 子集
 ⊃  > 真超集
 ⊇  >= 超集
 =  == 等於,兩個集合相等
 ≠  != 不等於
 ∈  in 屬於,是裡面的元素
 ∉  not in 不屬於

   這部分內容只能呼叫數學老師了。我就不講了。


 

 

2.普通內置方法

  雖說在幫助文檔中列出了一堆方法,但集合是分為可變的和不可變的,所以有些方法,如修改操作只有可變的集合可以使用,所以內置方法又可以分為兩種:

1.所有集合都能使用的:

方法 說明
a.issubset(b) 如果a是b的子集,則返回True,否則返回False
a.issuperset(b) 如果a是b的超集,則返回True,否則返回False
a.intersection(b) 返回a和b的交集
a.union(b) 返回a和b的並集
a.difference(b) 返回一個新集合,該集合是集合a去除和b元素部分後的
a.symmetric_difference(b) 返回一個新集合,該集合是a或b的成員,但不是a和b共有的成員
a.copy() 返回一個淺拷貝。

 

2.可修改集合才能用的:

方法 說明
a.add() 在集合里添加新的對象
a.clear() 清空集合里的所有對象
a.pop() 刪除a中的任意元素,並返回,為空時報錯
a.remove(obj) 在a中刪除obj這個元素,沒找到時報錯
a.discard(obj) 在a中刪除obj這個元素,沒找到時什麼都不做,返回None
a.update(b) 用b中的元素修改a,此時a包含a或b的成員。相當與合併
a.intersection_update(b) 用a和b的交集更新a集合
a.difference_update(b) 從a中移除和b一樣的元素
a.symmetric_difference(b) 將a修改成a和b的對稱差分

 


  這裡交並補、子集超集之類的基本數學概念就不再重覆了。這裡講下差補和對稱差分:

1.差補

a =set( 'scolia')
b = set('good')
print a - b
print a.difference(b)

 

  實際上就是幹掉了 a 中的 'o',而之所以幹掉 'o' 是因為兩個集合裡面都有 'o'。

  本想用數學公式來解釋一番的,然而我的數學也已經遺忘到太平洋里去了。

 

2.對稱差分

a =set( 'scolia')
b = set('good')
print a ^ b
print a.symmetric_difference(b)

 

  

  將幹掉兩種的交集,然後把剩下來的拿出去組成新集合。

  


 

 

 好了,集合就先講到這裡了,這麼多東西我也不一定全部記得住,要用的時候再來查就行了。

參考資料:戳這裡

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用源文件 現在讓我們重新開始編程。當你學習一種新的編程語言的時候,你編寫運行的第一個程式通常都是“Hello World”程式,這已經成為一種傳統了。在你運行“Hello World”程式的時候,它所做的事只是說聲:“Hello World”。正如提出“Hello World”程式的Simon C ...
  • 開發PHP的朋友都知道,其實最擔心的就是程式中出現一些異常或錯誤,這些狀況如果輸出到用戶的螢幕會把用戶給嚇壞,甚至為此丟了工作,如果不輸出到螢幕就得想辦法記錄到日誌中,但是似乎不是每個人都有查看錯誤日誌的習慣,爲瞭解決這個尷尬的問題,所以我寫了這段代碼,其用意就是當我們寫的php程式出錯的時候把錯誤 ...
  • 首先,移位運算符有三種,其操作類型只支持:byte / short / char / int和long五種。 << 左移運算符,表示將左邊的操作數的二進位數據向左移動*位,移動後空缺位以0填充,多餘位捨棄。(等同於乘2的n次方) >> 右移運算符,二進位數據向右移動*位,就在其二進位數據後抹掉幾位? ...
  • ...
  • 上篇文章介紹了PHP添加元素到數組的函數,那麼當然有從數組中刪除元素。array_pop和array_shift只從數組的頭或尾刪除一個元素。經過閱讀源碼,發現這兩個函數的實現都是調用了同一個函數--_phpi_pop來實現從數組中刪除一個數組元素的功能。因此解讀時將這兩個函數一併講了。 ...
  • 引言 Martin Fowler的《重構:改善既有代碼的設計》一書從2003年問世至今已有十幾年時間了,按照電腦領域日新月異的變化速度,重構已經算是一門陳舊的技術了。但是陳舊並不代表不重要,恰恰隨著演進式設計被越來越廣泛的使用,重構技術已經被認為是現代軟體開發中的一項必備的基本技能!所以今天在任何 ...
  • 應用部署weblogic 報錯Unsupported major.minor version 51.0的解決過程 1、部署提示錯誤:Unsupported major.minor version 51.0 1.1 錯誤現象如下圖所示: 1.2 原因分析 類似錯誤均屬於Java版本問題,即JDK版本過... ...
  • 前面我們完成了微信公眾號的`伺服器配置`,並且完成了token的驗證.現在我們嘗試回覆用戶發送給公眾號的文本消息.1.首先我們確定`微信配置`為`啟用`狀態. 2.然後我們進入微信公眾平臺的`沙盒測試賬號`,因為在這種狀態下對已各種藉口的許可權限制比較小,而且這是一個獨立的公眾號,有獨立的`appID ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...