您好,登錄后才能下訂單哦!
在python變量中除了以前文章所提到的整形int / 浮點(diǎn)數(shù)float / 布爾值bool / 列表list / 字典dict 之外,還有一個(gè)類型我們還沒有做詳細(xì)介紹,這個(gè)變量類型就是集合set。
一.set集合簡介
python set集合使用大括號 { }表示,與字典dict不同的是set集合并沒有key/value鍵值對,主要有以下兩個(gè)特點(diǎn):
1.元素不允許重復(fù)
2.set 不記錄元素的添加順序,即是無序的,和字典類似
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解憂 @Blog(個(gè)人博客地址): shuopython.com @WeChat Official Account(微信公眾號):猿說python @Github:www.github.com
@File:python_set.py @Time:2019/11/09 21:25
@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累! """
# 創(chuàng)建一個(gè)空集合set set_a = set() # 打印集合set print(set_a) # 查看類型 print(type(set_a)) print("***"*20)
# 創(chuàng)建一個(gè)集合 set_b = {"猿說python",False} print(type(set_b)) print(set_b) print("***"*20)
# 創(chuàng)建一個(gè)字典 dict_b = {"name":"猿說python","url":"www.shuopython.com"} print(type(dict_b)) print(dict_b) |
輸出結(jié)果:
1 2 3 4 5 6 7 8 | set() <class 'set'> ************************************************************ <class 'set'> {False, '猿說python'} ************************************************************ <class 'dict'> {'name': '猿說python', 'url': 'www.shuopython.com'} |
代碼分析:觀察上面代碼,雖然字典dict 和 集合set 都是由{}構(gòu)成,注意字典由鍵值對key/value構(gòu)成,而集合確是由一個(gè)一個(gè)數(shù)據(jù)構(gòu)成,和列表的元素類似!
add() — 向 set 集合中添加元素;
remove() — 刪除元素,如果集合中不包含被刪除的元素,remove() 方法會報(bào)出 KeyError 異常;
discard() — 刪除元素,如果集合中不包含被刪除的元素,不會有任何提示或者 異常;
clear() — 就是清空白 set 集合;
copy() — 拷貝一個(gè)集合;
difference() — 返回多個(gè)集合的差集;
difference_update() — 移除集合中的元素,該元素在指定的集合也存在;
intersection() — 返回集合的交集,不改變集合本身,而是返回兩個(gè)集合的交集;
intersection_update() — 返回集合的交集,會通過交集運(yùn)算改變第一個(gè)集合;
isdisjoint() — 判斷兩個(gè)集合是否包含相同的元素,如果沒有返回 True,否則返回 False;
issubset() — 判斷指定集合是否為該方法參數(shù)集合的子集;
issuperset() — 判斷該方法的參數(shù)集合是否為指定集合的子集;
pop() — 隨機(jī)移除元素;
symmetric_difference() — 移除當(dāng)前集合中在另外一個(gè)指定集合相同的元素,并將另外一個(gè)指定集合中不同的元素插入到當(dāng)前集合中;
union() — 返回兩個(gè)集合的并集;
update() — 用于修改當(dāng)前集合,可以添加新的元素或集合到當(dāng)前集合中,如果添加的元素在集合中已存在,則該元素只會出現(xiàn)一次,重復(fù)的會忽略;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | # 使用花括號構(gòu)建set集合 c = {'喬峰',"段譽(yù)","虛竹","天龍八部","射雕英雄傳"} # 添加元素 c.add("天山姥姥") c.add(6) print("c集合的元素個(gè)數(shù)為:" , len(c)) print(c) # 刪除指定元素 c.remove("天山姥姥") print(c) print("c集合的元素個(gè)數(shù)為:" , len(c)) print("***"*20)
# 判斷是否包含指定字符串 print("c集合是否包含'喬峰'字符串:" , ("喬峰" in c)) # 輸出True print("***"*20)
# 使用set()函數(shù)(構(gòu)造器)來創(chuàng)建set集合 movies = set() movies.add("天龍八部") movies.add("射雕英雄傳") print("movies集合的元素:" , movies) # issubset()方法判斷是否為子集合 print("movies集合是否為c的子集合?", movies.issubset(c)) # 輸出False
# issuperset()方法判斷是否為父集合 # issubset和issuperset其實(shí)就是倒過來判斷 print("c集合是否完全包含books集合?", c.issuperset(movies)) # 輸出False # 用c集合減去books集合里的元素,不改變c集合本身 result1 = c - movies print(result1)
# difference()方法也是對集合做減法,與用-執(zhí)行運(yùn)算的效果完全一樣 result2 = c.difference(movies) print(result2)
# 用c集合減去books集合里的元素,改變c集合本身 c.difference_update(movies) print("c集合的元素:" , c)
# 刪除c集合里的所有元素 c.clear() print("c集合的元素:" , c) print("***"*20)
# 直接創(chuàng)建包含元素的集合 d = {"python面向?qū)ο?quot;, 'python基礎(chǔ)', 'python爬蟲'} print("d集合的元素:" , d)
# intersection()方法也是獲取兩個(gè)集合的交集,與用&執(zhí)行運(yùn)算的效果完全一樣 inter2 = d.intersection(movies) print(inter2) # 計(jì)算兩個(gè)集合的交集,改變d集合本身 d.intersection_update(movies) print("d集合的元素:" , d) print("***"*20)
# 將range對象包裝成set集合 e = set(range(5)) f = set(range(3, 7)) print("e集合的元素:" , e) print("f集合的元素:" , f)
# 計(jì)算兩個(gè)集合的并集,不改變e集合本身 un = e.union(f) print('e和f執(zhí)行并集的結(jié)果:', un) # 計(jì)算兩個(gè)集合的并集,改變e集合本身 e.update(f) print('e集合的元素:', e) |
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | c集合的元素個(gè)數(shù)為: 7 {'天龍八部', 6, '虛竹', '喬峰', '段譽(yù)', '天山姥姥', '射雕英雄傳'} {'天龍八部', 6, '虛竹', '喬峰', '段譽(yù)', '射雕英雄傳'} c集合的元素個(gè)數(shù)為: 6 ************************************************************ c集合是否包含'喬峰'字符串: True ************************************************************ movies集合的元素: {'天龍八部', '射雕英雄傳'} movies集合是否為c的子集合? True c集合是否完全包含books集合? True {'喬峰', '段譽(yù)', 6, '虛竹'} {'喬峰', '段譽(yù)', 6, '虛竹'} c集合的元素: {6, '虛竹', '喬峰', '段譽(yù)'} c集合的元素: set() ************************************************************ d集合的元素: {'python爬蟲', 'python基礎(chǔ)', 'python面向?qū)ο?#39;} set() d集合的元素: set() ************************************************************ e集合的元素: {0, 1, 2, 3, 4} f集合的元素: {3, 4, 5, 6} e和f執(zhí)行并集的結(jié)果: {0, 1, 2, 3, 4, 5, 6} e集合的元素: {0, 1, 2, 3, 4, 5, 6} |
三.set集合運(yùn)算符
<=:相當(dāng)于調(diào)用 issubset() 方法,判斷前面的 set 集合是否為后面的 set 集合的子集合。
>=:相當(dāng)于調(diào)用 issuperset() 方法,判斷前面的 set 集合是否為后面的 set 集合的父集合。
–:相當(dāng)于調(diào)用 difference() 方法,用前面的 set 集合減去后面的 set 集合的元素。
&:相當(dāng)于調(diào)用 intersection() 方法,用于獲取兩個(gè) set 集舍的交集。
^:計(jì)算兩個(gè)集合異或的結(jié)果,就是用兩個(gè)集合的并集減去交集的元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # 使用花括號構(gòu)建set集合 c = {'喬峰',"段譽(yù)","虛竹","天龍八部","射雕英雄傳"}
# 使用set()函數(shù)(構(gòu)造器)來創(chuàng)建set集合 movies = set() movies.add("天龍八部") movies.add("射雕英雄傳") print("movies集合的元素:" , movies) # issubset()方法與<=運(yùn)算符效果相同 print("movies集合是否為c的子集合?", (movies <= c)) # 輸出False print("***"*20)
e = set(range(5)) f = set(range(3, 7)) print("e集合的元素:" , e) print("f集合的元素:" , f) # 對兩個(gè)集合執(zhí)行異或運(yùn)算 xor = e ^ f print('e和f執(zhí)行xor的結(jié)果:', xor)
# 直接創(chuàng)建包含元素的集合 d = {"python面向?qū)ο?quot;, 'python基礎(chǔ)', 'python爬蟲'} print("d集合的元素:" , d) # 計(jì)算兩個(gè)集合的交集,不改變d集合本身 inter1 = d & movies print(inter1) |
輸出結(jié)果:
1 2 3 4 5 6 7 8 | movies集合的元素: {'天龍八部', '射雕英雄傳'} movies集合是否為c的子集合? True ************************************************************ e集合的元素: {0, 1, 2, 3, 4} f集合的元素: {3, 4, 5, 6} e和f執(zhí)行xor的結(jié)果: {0, 1, 2, 5, 6} d集合的元素: {'python基礎(chǔ)', 'python面向?qū)ο?#39;, 'python爬蟲'} set() |
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。