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.Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例 按增刪改查的思路來 增: touch filename:這個命令本身不是用來新建文件的,它是用來修改文件的時間屬性,不過默認情況時當filename不存在時,它會默認建立一個空文件 mkdir: 常用參數 -p:相當于遞歸創建目錄 -v:顯示出創建過程中的信息 cp : 常用參數 -r:…

    Linux干貨 2016-11-06
  • 運維架構之httpd

    Web Service 傳輸層:提供進程地址 Port number tcp:傳輸控制協議,面向連接,通信前需建立虛擬鏈路,結束后拆除;0-65535 udp:用戶數據報協議,無連接;0-65535 IANA 0-1023:眾所周知,永久分配給固定應用使用;22/tcp(ssh)、80/tcp(http)、443/tcp(https) 1024-41951:…

    系統運維 2018-06-04
  • 馬哥教育網絡班21期+第五周課程練習

    1. 顯示/boot/grub/grub.conf中至少以一個空白字符開頭的行 [root@hadoop ~]# grep "^[[:space:]]\+" /boot/grub/grub.conf 2. 顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面至少一個空白字符,而后又有至少…

    Linux干貨 2016-08-05
  • 20160803作業-用戶組和權限管理

    http://note.youdao.com/yws/public/redirect/share?id=46f06331b737c6d08a0e8c9c3d49ac9e&type=false

    Linux干貨 2016-08-08
  • 22期第五周課堂練習

    1、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行; [root@localhost ~]# grep "^[[:space:]]\+" /boot/grub/grub.conf 2、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又…

    Linux干貨 2016-09-08
  • ps查看進程

    ps命令 ps [OPTION]支持三種選項UNIX選項 如-A -eBSD選項 如aGNU選項 如–help選項:默認顯示當前終端中的進程a 選項包括所有終端中的進程x 選項包括不連接終端的進程u 選項顯示進程所有者的信息f 選項顯示進程樹,相當于 –forestk|–sort 屬性 對屬性排序,屬性前加- 表示倒序o …

    2017-12-19
欧美性久久久久