1. 程式人生 > 其它 >Python連載(0014): 集合(set)

Python連載(0014): 集合(set)

技術標籤:# 老王的Python筆記python

文章目錄

1. 什麼是集合(set)

集合(set)跟我們學過的列表(list)有點像,也可以存放一堆資料,不過它有幾個獨特的特點:

  • 集合中的元素不可變。
  • 集合中可以存放字串、數字、元組等不可變型別,不能存放列表、字典。
  • 天生去重,在集合裡沒辦法存重複的元素。
  • 無序,不像列表一樣通過索引來標記元素的位置。因為集合中的元素是無序的,所以{3,4,5}和{3,5,4}算作同一個集合。

基於集合的這些特定,我們常用它來進行去重關係運算

2. 集合的建立

# 方式1: 使用大括號建立集合
set_1 = {1, 2, 3, "hello"} print(set_1) # 方式2:使用set()將可迭代物件轉換為集合 # 將列表轉換為集合 set_2 = set([1, 2, 3, "hello"]) # 將字串轉換為集合 set_3 = set("12345") print(set_2) print(set_3)

image-20210130141409268

注:建立一個空集合,不能使用null_set = {}的方式,只能用null_set = set()。因為null_set = {}建立的是一個空字典。

null_set = {}
type(null_set)
# 驗證null_set的資料型別 null_set = set() type(null_set) # 驗證null_set的資料型別

image-20210130141637091

利用集合,可以快速刪除列表中的重複元素:

list_a = [1, 2, 3, 5, 1, 2, 4, 5]
set_a = set(list_a)		# 將列表轉換成集合,刪除重複元素
list_b = list(set_a)	# 將集合再轉換成列表
print(list_b)

image-20210130151419251

3. add(): 向集合中增加元素

students = {"Tom", "Lucy", "Lily"}
print(students)

# 向集合中新增元素"James"
students.add("James")
print(students)

# 向結合中新增元素"Tom",因為”Tom"在集合中已經存在,所以集合不會發生改變
students.add("Tom")
print(students)

image-20210130143341902

4. update(): 向集合中增加元素

update()也可以用來向集合中增加元素,比較特殊的是,它的引數可以是列表、元組、字典等。

# 示例1: 以列表作為update()引數
students = {"Tom", "Lucy", "Lily"}

add_list = ["老張", "老王"]
students.update(add_list)
print(students)

image-20210130143721033

# 示例2: 以多個列表作為update()引數
students = {"Tom", "Lucy", "Lily"}

add_list_1 = ["老張", "老王"]
add_list_2 = ["老陳", "老劉"]
students.update(add_list_1, add_list_2)
print(students)

image-20210130143838064

# 示例3:以元組作為update()引數
students = {"Tom", "Lucy", "Lily"}
add_tuple = ("老張", "老劉")
students.update(add_tuple)
print(students)

image-20210130144134597

# 示例4:以集合作為update()引數
students = {"Tom", "Lucy", "Lily"}
add_set = {"老張", "老劉"}
students.update(add_set)
print(students)

image-20210130144307957

# 示例5:以字典作為update()引數
# 注意,以字典作為update()引數時,只會把字典的key新增到集合中
students = {"Tom", "Lucy", "Lily"}
add_dict = {"老張":0, "老劉":1}
students.update(add_dict)
print(students)

image-20210130144446152

5. discard(): 刪除集合中的指定元素

discard()用於從集合中刪除指定元素,如果元素在集合中不存在,程式執行不會出錯。

students = {"Tom", "Lucy", "Lily"}

# 刪除元素"Lily"
students.discard("Lily")
print(students)

# 嘗試刪除一個不存在的元素
students.discard("James")
print(students)

image-20210130143102805

6. remove(): 刪除集合中的指定元素

remove()用於從集合中刪除指定元素,如果元素在集合中不存在,則程式執行出錯。

students = {"Tom", "Lucy", "Lily"}

# 刪除元素"Lily"
students.remove("Lily")
print(students)

# 嘗試刪除一個不存在的元素
students.remove("James")

image-20210130142917768

7. pop(): 隨機刪除集合中一個元素

students = {"Tom", "Lucy", "Lily"}

# 使用pop()隨機刪除一個元素,並將該元素返回
name = students.pop()
print("從集合中刪除了{}。".format(name))

image-20210130142634728

8. in: 判定元素是否在集合中

students = {"Tom", "Lucy", "Lily"}
if "Lucy" in students:
    print("Lucy在集合中。")
else:
    print("Lucy不在集合中。")

9. clear(): 清空集合

students = {"Tom", "Lucy", "Lily"}
print(students)
students.clear()
print(students)

image-20210130151005685

10. len(): 集合中元素的個數

students = {"Tom", "Lucy", "Lily"}
print(len(students))

image-20210130151106028

11. 關係運算

假設現在有兩個興趣班,一個學習C語言,一個學習Python。現在將這兩個班裡的學生名字儲存為兩個集合:

# C語言班的學生
c_students = {"老王", "老張", "老劉"}

# Python班的學生
p_students = {"老趙", "老錢", "老王"}

11.1 求兩個集合的交集: &

交集:兩個集合中都包含的元素。

# C語言班的學生
c_students = {"老王", "老張", "老劉"}

# Python班的學生
p_students = {"老趙", "老錢", "老王"}

# 獲取同時參加兩門課的學生名單
print(c_students & p_students)

image-20210130152009391

11.2 求兩個集合的並集(也稱為合集): |

並集:兩個集合中的所有元素彙總。

# C語言班的學生
c_students = {"老王", "老張", "老劉"}

# Python班的學生
p_students = {"老趙", "老錢", "老王"}

# 獲取兩門課所有學生的名單
print(c_students & p_students)

image-20210130152143390

11.3 求兩個集合的差集

差集:屬於集合A,但是不屬於集合B的元素

# C語言班的學生
c_students = {"老王", "老張", "老劉"}

# Python班的學生
p_students = {"老趙", "老錢", "老王"}

# 參加了C語言班,但是沒參加Python班的學生
print(c_students - p_students)

# 參加了Python語言班,但是沒參加C語言班的學生
print(p_students - c_students)

image-20210130152421234

11.4 求兩個集合的對稱差集: ^

對稱差集:只屬於一個集合的元素,也就是將兩個集合求合集之後,再去除兩個集合的交集。(換句話說就是把腳踏兩條船的人給刪掉)

# C語言班的學生
c_students = {"老王", "老張", "老劉"}

# Python班的學生
p_students = {"老趙", "老錢", "老王"}

# 只報了一門課程的學生名單
print(c_students ^ p_students)

image-20210130152918393

11.5 判斷兩個集合是否相交:isdisjoint()

也就是判斷兩個集合有沒有共同元素。如果沒有共同元素,則返回True;如果有共同元素,則返回False。

# C語言班的學生
c_students = {"老王", "老張", "老劉"}

# Python班的學生
p_students = {"老趙", "老錢", "老王"}

# 判定C班的名單和Python班的名單有沒有重合的,如果沒有,則返回True
if c_students.isdisjoint(p_students):
    print("C班的學生都沒有學Python。")
else:
    print("C班的學生有學Python的。")

11.6 判斷一個集合是不是另一個集合的子集:issubset()

也就是集合A的元素是不是都在集合B中能找到。

# C語言班的學生
c_students = {"老王", "老張", "老劉"}

# Python班的學生
p_students = {"老趙", "老錢", "老王", "老張", "老劉"}

# 判斷C班的學生是不是都在Python班的名單中,如果是,則返回True。
if c_students.issubset(p_students):
    print("C語言班的同學都在學Python。")
else:
    print("並不是所有C語言班同學都在學Python。")

11.7 判斷一個集合是不是另一個集合的父集:issuperset()

也就是判斷集合A是不是包含了集合B的所有元素。

# C語言班的學生
c_students = {"老趙", "老錢", "老王", "老張", "老劉"}

# Python班的學生
p_students = {"老趙", "老錢", "老王"}

# 判斷C班的學生名單是不是包含了Python班的所有學生,如果是,則返回True。
if c_students.issuperset(p_students):
    print("Python班的所有同學都在學C。")
else:
    print("Python班並不是所有同學都在學C。")