Python內置數據結構——集合set

集合

定義

  • set翻譯為集合
  • collection翻譯為集合類型,是一個較大的概念
  • set是一個可變的、無序的、不重復的元素組成的集合
  • set的元素要求必須可以hash,目前已學的不可hash的類型只有list、set
  • 元素不可以索引
  • set可以迭代

set的初始化

  • set_1 =set() #表示定義一個空集合set_1
  • set_1 =set(iterable) #講一個可迭代對象的元組添加到set_1這個集合中

set的操作

- add(elem)
    增加一個元素到set中,如果元素存在則什么都不做
- update(*others)
    合并其他元素到set中,參數others必須是可迭代對象;屬于就地修改
- remove(elem)
    從set中移除一個元素,元素若不存在,則報keyerror
- discard(elem)
    從set中移除一個元素,若不存在則什么都不做
- pop()
    移除并返回任意元素。若是空set則返回keyerror
- clear()
    移除所有元素,若set很大會引起GC(內存垃圾回收)
- 修改
    在set中,要么刪除,要么添加,由于set是無序的,只有通過hash值來查找元素,修改就相當于先刪除再添加
- 查詢
    非線性結構,無法索引;除非知道某個值確切再set中,通過hash值來查看
- 遍歷
    可以迭代所有元素,
- 成員運算符
    in和not in判斷元素是否再set中,由于是通過hash值來查找的,所以效率為O(1)

set和線性結構

  • 線性結構的查詢時間復雜度是O(n),隨著數據規模增大而增大加耗時
  • set、dict(dictionary字典)等結構,內部使用hash值作為key,時間復雜度可以做到O(1),查詢時間和數據規模無關
  • 可hash
    - 數值型int、float、complex
    - bool型True、False
    - 字符串string、bytes
    - 元組tuple
    - None
    以上都是不可變類型,成為可hash類型(hashable)
  • set的元素必須是可hash的

集合的概念

  • 基本概念
- 全集
    所有元素的集合。例如正整數集,所有正整數組成的集合
- 子集subset和超集superset
    集合A的所有元素都在集合B中,稱A是B的子集,B是A的超集
- 真子集和真超集
    A是B的子集,且A的元素比B少,則稱A是B的真子集,B是A的真超集
- 并集是多個集合合并的結果
- 交集是多個集合的公共部分
- 差集是集合中出去交集外的部分
  • 集合運算
1. 并集
將兩個集合A和B的所有元素合并到一起,組成的集合叫A和B的并集
    - union(*others)    返回和多個集合合并后的新的集合,例:s1.union(s2[,s3])
    - '|'運算符重載 等同于union,例:s1|s2[|s3]
    - update(*others)   和多個集合合并,就地修改,例:s1.update(s2[,s3])
    - '|='  等同于update,例:s1|= s2 [| s3]

2. 交集
集合A和集合B中所有同時屬于A和B的元素組成的集合叫A和b的交集
    - intersection(*others) 返回多個集合的交集
    - '&'   等同于intersection
    - intersection_update(*others)  獲取多個集合的交集,就地修改
    - '&='  等同于intersection_update
    
3. 差集
集合A和B,所有屬于A切不屬于B的元素組成的的集合
    - difference(*othens)   返回多個集合的差集
    - '-'   等同于difference
    - difference_update(*others)返回多個集合的差集并就地修改
    - '-='  等同difference_update

4. 對稱差集
集合A和B,有所欲不屬于A和B的交集元素組成的集合稱為對稱差集
    - symmetric_difference(other)   返回另一個集合的差集
    - '^'   等同于symmetric_difference
    - symmetric_difference_update(other)    獲取和另一個集合的差集并就地修改
    - '^='  等同于symmetric_difference_update

- issubnet(other)、<=
    判斷當前集合是不是另一個集合的子集
- set1 < set2
    判斷set1是不是set2的真子集
- issuperset(other)、>=
    判斷當前集合是不是other的超集
- set1 > set2 
    判斷set1是不是set2的正超集
- isdisjoint(other)
    當前集合和另一個集合沒有交集返回True,有交集返回False

練習

  • 隨機產生2組10個數字的列表,取值范圍[10,20]
    1. 統計20個數字中有多少個不同的數字
    2. 2組中,不重復的數字有幾個,是什么
    3. 兩組中重復的數字有幾個是什么
import random


fst_nums = []
sec_nums = []
for _ in range(10):
    fst_nums.append(random.randint(10,20))
    sec_nums.append(random.randint(10,20))
print(fst_nums,sec_nums)    #created random sequence
print()

fst_nums,sec_nums = set(fst_nums),set(sec_nums)

print(fst_nums|sec_nums)
print(fst_nums ^ sec_nums)
print(fst_nums & sec_nums)

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87626

(0)
KX_ilKX_il
上一篇 2017-10-02 11:56
下一篇 2017-10-03 09:29

相關推薦

  • 第八周作業

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。    集線器(HUB)主要功能是對接收到的信號進行再生整形放大,以擴大網絡的傳輸距離,同時把所有節點集中在以它為中心的節點上。集線器是一種共享設備,HUB本身不能識別目的地址,當同一局域網內的A主機給B主機傳輸數據時,數據包在以HUB為架構…

    Linux干貨 2017-02-27
  • Awk

    awk各種詳細使用方法

    Linux干貨 2018-01-02
  • HTTP詳解(1)-工作原理

    1. HTTP簡介          HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用于從WWW服務器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸…

    Linux干貨 2015-04-04
  • N26-第六周

    請詳細總結vim編輯器的使用 vim 模式化的編輯器 vim的三種模式:1.編輯模式(命令模式)                          2.輸入模式          …

    Linux干貨 2017-03-13
  • Linux基礎之安全加密及CA、證書實戰應用

    一、建立私有CA并讓客戶端申請請求,需要兩臺虛擬機完成 1、建立私有CA,生成私鑰 2、CA公司給自己,生成自簽證書 3、為CA提供所需要的目錄及文件(如果事先存在,此步驟可以跳過) 二、CA公司已建立,需要一臺客戶機配合CA簽署證書 1、客戶端用到證書,因此生成私鑰 2、客戶端生成證書簽署請求 3、將請求通過可靠方式發送給CA主機,這里作為測試,因此使用s…

    Linux干貨 2016-10-04
  • CentoS 6.8 安裝(小白請進)

    先說點題外話,我現在還是一個小白,剛接觸‘高大上’的linux不久,隨著深入的學習了解,興趣越來越濃,這個東西很有意思的,不像學windows那樣枯燥無味,真的,不信?歡迎加入馬哥大家庭。 廢話不多說,注意了:前方高能!?。?首先呢,先下載一個VMware Workstation這個虛擬機軟件,它的作用很強大,可以使你在一臺機器上同時運行一個甚至多個linu…

    2017-02-17
欧美性久久久久