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/87628

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

相關推薦

  • 高階函數

    高階函數 Frist class object 函數在python中是一等公民 函數也是對象,可調用的對象 函數可以作為普通變量,參數,返回值等等 數學概念y=g(f(x)) 在數學和計算機科學中,高階函數應當是至少滿足下面一個條件的函數 接受一個或者多個函數作為參數 輸出一個函數 計數器: def counter(base):def inc(step=1)…

    Python筆記 2018-04-23
  • Python面向對象基礎

    語言分類 面向機器 抽象成機器指令,讓機器容易理解 代表:匯編語言 面向過程 按照步驟一步一步走,若出現情況A做相應的處理,若出現情況B做相應的處理 問題規模小,可以步驟化,按部就班處理 代表:C 面向對象OOP 計算機需要處理的問題的規模越來越大,需要多人、多部門協作 代表:C++、Java、Python 面向對象 一種認識世界、分析世界的方法論。將萬事萬…

    2018-05-06
  • DevOps 風向標!DevOps國際峰會6月29日正式啟航!

    DOIS 大會為您呈現互聯網公司與海外企業的實踐經驗與工具技術,聚焦 DevOps 在金融、電信、零售等行業的系統性實踐。在這里我們不空談、不務虛,實實在在的專注DevOps落地。

    2018-05-16
  • 遞歸函數

    遞歸函數 def foo(b,b1=3):print(“foo1 called “,b,b1)def foo2(c):foo3(c)print(“foo2 called”,c)def foo3(d):print(“foo3 called”)def mian():print(“…

    2018-04-16
  • mysql慢查詢日志進行按庫切割重寫文件然后分析

    需求: 把每天的慢查詢日志進行按庫切割 對每個庫的慢查詢日志進行分析 思路: 工具/功能 一般統計信息 高級統計信息 腳本 優勢 mysqldumpslow 支持 不支持 perl mysql官方自帶 mysqlsla 支持 支持 perl 功能強大,數據報表齊全,定制化能力強. mysql-explain-slow-log 支持 不支持 perl 無 my…

    Linux干貨 2015-04-03
  • Python基礎之if while for循環練習

    if for while循環練習 沒有邊界的最好用while,有邊界的最好用for 1.給定一個不超過5位數的正整數,判斷其有幾位 num = int(input()) if num<10: print(‘一位’) elif num<100: print(‘兩位’) elif num<1000: print(‘三位’) elif num&l…

    2017-09-16
欧美性久久久久