目錄
集合
集合的定義
集合操作
集合的內建函數
集合與內置函數
集合練習-1
集合練習-2
集合練習-3
集合
集合的定義
學習關于 Python 集的所有內容;如何創建它們、添加或刪除其中的元素,以及在 Python 中對集合執行的所有操作。
Python 中的集合是什么?
集合是項目的無序集合。每個元素都是唯一的(沒有重復項),并且必須是不可變的(不能更改)。
但是,集合本身是可變的。我們可以在其中添加或刪除項目。
集合可用于執行數學集合運算,例如并集,交集,對稱差等。
如何創建集合?
通過將所有項目(元素)放在大括號 {}
中并用逗號分隔或使用內置函數來創建集合 set()
。
它可以具有任意數量的項目,并且它們可以具有不同的類型(整數,浮點數,元組,字符串等)。但是集合不能具有可變元素(例如 list ,set 或 dictionary)作為其元素。
dic1 = {1, 2, 3}
dic2 = {1.0, (1, 2, 3), 'Hello'}
print(dic1)
print(dic2)輸出:
{1, 2, 3}
{1.0, (1, 2, 3), 'Hello'}
# 無重復集合
my_set = {1,2,3,4,3,2}
print(my_set)# 我們可以從列表中生成集合
my_set = set([1,2,3,2])
print(my_set)輸出:
{1, 2, 3, 4}
{1, 2, 3}
創建一個空集有點特殊。
空括號 {}
將在Python中創建一個空字典。為了建立一個沒有任何元素的集合,我們使用沒有任何參數的 set()
函數。
x = {} # 用{}初始化
print(type(x)) # 檢查a的數據類型x = set() # 初始化使用 set()
print(type(x)) # 檢查a的數據類型輸出:
<class 'dict'>
<class 'set'>
集合操作
如何在 Python 中更改集合?
集合是可變的。但由于它們是無序的,因此索引沒有意義。
我們無法使用索引或切片來訪問或更改集合的元素,這是集合不支持的操作。
我們可以使用 add()
方法添加單個元素,使用 update()
方法添加多個元素。update()
方法可以采用元組,列表,字符串或其他集合作為其參數。在所有情況下,都避免重復。
# 初始化 my_set
my_set = {1,3}
print(my_set)# 增加一個元素
my_set.add(2)
print(my_set)# 增加多個元素
my_set.update([2,3,4])
print(my_set)# 增加 list、set、tuple
my_set.update([4,5], {1,6,8},(9,10))
print(my_set)輸出:
{1, 3}
{1, 2, 3}
{1, 2, 3, 4}
{1, 2, 3, 4, 5, 6, 8, 9, 10}
從集合中刪除元素
可以使用 discard()
和 remove()
方法從集合中刪除特定項目。
兩者之間的唯一區別是,如果使用 discard()
,而項目不存在于集合中,則它保持不變。但是 remove()
在這種情況下會引發錯誤。
set_1 = {1,2,3,"hello"}
print(set_1.remove(1))
print(set_1)set_1.discard("hello")
print(set_1)輸出:
None
{2, 3, 'hello'}
{2, 3}
同樣,我們可以使用 pop()
方法刪除并返回一個項目。
集合為無序,無法確定將彈出哪個項目。這是完全任意的。
我們還可以使用 clear()
方法刪除集合中的所有項目。
set_2 = {"shell",2,5,"bash"}set_2.pop() # 使用pop方法刪除一個元素,并且隨機輸出!
print(set_2)set_2.clear() #使用clear方法刪除所有的元素
print(set_2)輸出:
{2, 5, 'shell'}
set()
Python 集合操作
集合可用于執行數學集合運算,例如并集,交集,差和對稱差。我們可以通過運算符或方法來實現。
集合并集
A 和 B 的并集是來自這兩個集合的所有元素的集合。
并集是使用 |
操作符執行的。也可以使用 union()
方法來完成。
# 初始化 A 和 B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}# 使用 | 運算符
print(A | B)#使用union()方法進行并集操作
print(A.union(B))
print(B.union(A))輸出:
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3, 4, 5, 6, 7, 8}
集合相交
A 和 B 的交集是在這兩個集合中共有的一組元素。
交點使用 &
運算符執行。使用 intersection()
方法可以完成相同的操作。
x = {1,2,3,4,5,6}
y = {4,5,6,7,8,9}#使用&進行交集操作
print(x & y)#使用intersection()方法進行交集
print(x.intersection(y))
print(y.intersection(x))輸出:
{4, 5, 6}
{4, 5, 6}
{4, 5, 6}
集合差異
A 和 B 的差 A - B 是僅在 A 中但不在 B 中的一組元素。類似地,B - A 是 B 中但不在 A 中的一組元素。
差異是使用 -
運算符執行的。使用 difference()
方法可以完成相同的操作。
x = {1,2,3,4,5,6}
y = {4,5,6,7,8,9}print(x - y)
print(x.difference(y))print(y - x)
print(y.difference(x))輸出:
{1, 2, 3}
{1, 2, 3}
{8, 9, 7}
{8, 9, 7}
集合對稱差異
A 和 B 的對稱差異是 A 和 B 中的一組元素,但兩者中的元素相同。
對稱差使用 ^
運算符執行。使用 symmetric_difference()
方法可以完成相同的操作。
x = {1,2,3,4,5,6}
y = {4,5,6,7,8,9}print(x ^ y)
print(y ^ x)print(x.symmetric_difference(y))
print(y.symmetric_difference(x))輸出:
{1, 2, 3, 7, 8, 9}
{1, 2, 3, 7, 8, 9}
{1, 2, 3, 7, 8, 9}
{1, 2, 3, 7, 8, 9}
集合的內建函數
不同的 Python 集合方法
集合方法很多,上面已經使用了其中的一些方法。這是 set (集合)對象可用的所有方法的列表。
方法 | 描述 |
---|---|
add() | 將元素添加到集合中 |
clear() | 從集合中刪除所有元素 |
copy() | 返回集合的副本 |
difference() | 返回兩個或多個集合的差作為新集合 |
difference_update() | 從該集合中刪除另一個集合的所有元素 |
discard() | 如果元素是成員,則從集合中刪除它。(如果元素不在集合中,則不執行任何操作) |
intersection() | 返回兩個集合的交集作為新集合 |
intersection_update() | 用自身和另一個的交集更新集合 |
isdisjoint() | 如果兩個集合的交點為空,則返回 True,否則返回 False。 |
issubset() | 返回 True 另一個集合是否包含此集合 |
issuperset() | 返回 True 此集合是否包含另一個集合 |
pop() | 刪除并返回一個任意的 set 元素。如果集合是空的,調用 pop() 方法將會引發 KeyError 異常! |
remove() | 從集合中刪除一個元素。如果元素不是成員,則引發一個 KeyError |
symmetric_difference() | 將兩個集合的對稱差作為新集合返回 |
symmetric_difference_update() | 用本身和另一個的對稱差異更新一個集合 |
union() | 返回新集合中集合的并集 |
update() | 用自身和其他元素的并集更新集合 |
其他集合操作
集合會員資格測試
我們可以使用 in 關鍵字來測試項目是否存在于集合中。
# 初始化 my_set
my_set = set("apple")# 檢查“a”是否存在
print('a' in my_set)# 檢查“p”是否存在
print('p' not in my_set)輸出:
True
False
遍歷集合 使用 for 循環,我們可以遍歷集合中的每個項目。(由于集合是無序的,運行結果順序可能不同)
for x in set("hello"):print(x)輸出:
h
o
e
l
集合與內置函數
內置函數如 all()
、any()
、enumerate()
、len()
、max()
、min()
、sort()
、sum()
等常用來與 set 一起執行不同的任務。
功能 | 描述 |
---|---|
all() | 如果集合的所有元素都為 True(或者集合為空),則返回 True。 |
any() | 如果集合中的任何元素為 True,則返回 True。 如果集合為空,則返回False。 |
enumerate() | 返回一個枚舉對象。它包含成對的所有項的索引和值。 |
len() | 返回集合中的長度(項目數)。 |
max() | 返回集合中最大的項目。 |
min() | 返回集合中最小的項目。 |
sorted() | 從集合中的元素返回一個新的排序列表(不對集合本身進行排序)。 |
sum() | 返回集合中所有元素的總和。 |
Python Frozenset
frozenset
是 Python 中的一種數據類型,類似于 set
,但具有不可變性,即一旦創建后不能被修改。與 set
不同,frozenset
是一種不可變集合。
與 set
類型不同,frozenset
類型的對象可以作為字典的 key,也可以作為另一個集合的元素,這是因為 frozenset
是不可變的,具有哈希值,可以進行哈希運算。
可以使用函數 Frozenset()
創建 Frozensets 。
此數據類型支持的方法,如 copy()
,difference()
,intersection()
,isdisjoint()
,issubset()
,issuperset()
,symmetric_difference()
和 union()
。由于不可變,因此沒有添加或刪除元素的方法。
# 初始化 A 和 B
A = frozenset([1, 2, 3, 4])
B = frozenset([3, 4, 5, 6])print(A.isdisjoint(B)) # (使用isdisjoint()函數來判斷兩個集合是否存在交集,如果存在返回false,反之返回true!)
print(A.difference(B)) # (差集)
print(A | B) # union()輸出:
False
frozenset({1, 2})
frozenset({1, 2, 3, 4, 5, 6})
集合練習-1
集合中最大的元素描述
輸入一個非空集合 my_set,輸出 my_set 中最大的元素。
my_set = eval(input())'''
print(max(my_set))
# 直接使用max函數!
''''''
print(sorted(my_set)[-1])
使用 sorted(my_set) 對集合中的元素進行排序,并取最后一個元素(即最大值),最后將其打印出來!
'''多種解法
集合練習-2
集合運算描述
給你三個集合 my_dict1、my_dict2 和 my_dict3,輸出在前兩個集合中都存在,但不在第三個集合中的元素個數。
my_set1 = eval(input())
my_set2 = eval(input())
my_set3 = eval(input())
'''
意思就是求set1和set2的交集,再求與set3的差集!(輸出差集的個數)
'''
print(len((my_set1 & my_set2) - my_set3))
集合練習-3
集合中絕對值小于 10 的元素之和描述
給你一個整數集合 my_set,輸出集合中絕對值小于 10 的元素之和。
my_set = eval(input())
sum_abs_lt_10 = sum(x for x in my_set if abs(x) < 10)
print(sum_abs_lt_10)'''
這段代碼實現了以下功能:1. eval(input()): 通過 input() 函數提示用戶輸入一個表達式,然后 eval() 函數將這個表達式作為 Python 代碼進行求值,得到一個集合對象并將其賦值給變量 `my_set`。
用戶輸入的表達式應該是一個包含整數元素的集合,例如 `{1, 2, 3, 4, 5}`。2. sum(x for x in my_set if abs(x) < 10): 這段代碼使用列表推導式來計算集合 `my_set` 中絕對值小于 10 的元素之和。具體地,對于集合 `my_set` 中的每個元素 `x`,
只有當 `x` 的絕對值小于 10 時,才將這個 `x` 累加到求和結果中。3. print(sum_abs_lt_10): 最后,將上一步計算得到的絕對值小于 10 的元素之和打印輸出。
'''