首頁 > 軟體

Python內建資料型別中的集合詳解

2022-03-18 19:00:29

1. 集合 set 簡介

集合的最大特徵是其每個元素都是唯一的,它可以刪除、可以增加、也可以通過增刪實現替換元素,但是它是沒有下標的,你無法通過下標或者切片功能存取集合。因為集合就像一個袋子裡面裝著顏色不一樣的玻璃球,你可以替換玻璃球,但是無法指定玻璃球存放的地點。

它最大的作用,就是它元素的唯一,它經常被用來清除多餘的資料。

1.1 使用 { } 直接建立集合

可以使用 {} 直接建立集合,但是不能使用 {} 建立空集合,因為 {} 被用來建立空字典。你只能通過 set() 來建立空集合。

1.2 使用 set() 函數建立集合

使用內建函數 set,可以快速的將其他型別的可迭代物件轉換成 集合 物件。這些可迭代物件,可以是字串、列表、元組等等。

print("建立一個空集合")
print(set())
str1 = 'ABCDEF!'
s=set(str1)
print("*"*40)
print("一個由字串轉換的集合,每個元素即唯一的單獨字元")
print(s)
list1 = [0,1,2,3,4,3,2,1]
s=set(list1)
print("*"*40)
print("一個由列表轉換的集合,但是在列表中重複的元素只會出現一次")
print(s)

2. 集合沒有切片功能!

請仔細理解,集合沒有切片功能,這意味著什麼,這意味著無法對它排序(當然可以轉換成列表再排序),意味著無法用 while 迴圈配合下標依次獲得元素,你可以用 for 迴圈獲取。

3. 處理集合的常見內建函數

3.1  len 函數

len 函數返回集合的長度,即元素的個數。

3.2  map 函數

map 函數對集合中的每個元素進行相同的操作,然後返回一個 map 物件,再使用 set 函數可以得到集合

>>> a
{'sdf', 'er'}
>>> set(map(lambda x:x+"-",a))
{'er-', 'sdf-'}

3.3  filter 函數

filter 函數對集合中的每個元素進行相同的操作,符合條件的元素才留下來,返回一個 filter 型別的物件。

>>> a
{'sdf', 'er'}
>>> set(filter(lambda x:len(x)==2,a))
{'er'}

3.4  reduce 函數

filter 函數依次對集合中的元素進行相同的迭代操作最後得到一個物件。

>>> import functools
>>> a
{'sdf', 'er'}
>>> functools.reduce(lambda x,y:x+"~"+y,a)
'sdf~er'

3.5  sum 函數

sum 函數,只對元素是數值的集合有效,返回列表中的元素總和,如果元素型別不是數值,則返回 TypeError。

3.6  max 函數

max 函數,返回集合中的元素最大值。

3.7  min 函數

min 函數,返回集合中的元素最小值。

>>> a={1,2,3}
>>> sum(a)
6
>>> min(a)
1
>>> max(a)
3
>>> 

3.8  sorted 函數

sorted 函數會對集合按照指定方式進行排序,請注意,使用 sorted 函數會得到一個排好序的列表,不是集合!!!原集合不會改變。

list1 = [0,1,2,3,4,3,2,1]
s=set(list1)
s1=sorted(s)
print(s1)
print(type(s1))

3.9 enumerate 函數

enumerate 函數可以將一個集合依次取出。

3.10 any 函數

any() 函數用於判斷給定的集合的所有元素是否都為 False,則返回 False,如果有一個為 True,則返回 True。

3.11 all 函數

all() 函數用於判斷給定的集合的所有元素是否都為 TRUE,如果是返回 True,否則返回 False。

4. 集合的內建方法

4.1  .add(val) 

.add(val) 方法附加一個元素 val,如果 val 已經在集合中,那麼原來的集合不變化。

4.2  .clear() 

.clear() 方法將集合清空。 

4.3  .copy()

.copy() 方法將返回集合的拷貝(而不是和原來的列表共用同一個地址)。 

4.4  .difference(set1,set2,...)

difference() 方法用於返回集合的差集,即返回的集合元素包含在第一個集合中,但不包含在第二、三、N個集合(方法的引數)中。

4.5  .difference_update(set1,set2,...)

difference_update() 方法用於移除兩個或者多個集合中都存在的元素。

difference_update() 方法與 difference() 方法的區別在於 difference() 方法返回一個移除相同元素的新集合,而 difference_update() 方法是直接在原來的集合中移除元素,沒有返回值。

# 集合的使用
a={1,2,3,4,1}
b={4,5,6,7}
# 1.集合是不會有重複的元素的
print("1. ",a)
# 2.集合使用 add 方法加一個元素
a.add("6")
print("2. ",a)
# 3.集合使用 clear 方法清空
a.clear()
print("3. ",a)
a={1,2,3,4}
# 4.集合使用 copy 方法複製資料
c=a.copy()
print("4. ",c)
# 5.集合使用 difference 方法返回
#   和其他集合不一樣的資料
print("5. ",a.difference(b))
# 6.集合使用 difference_update 方法刪除
#   和其他集合一樣的資料
# a={1,2,3,4}
# b={4,5,6,7}
a={1,2,3,4}
b={4,5,6,7}
print("6. ",a.difference_update(b))
print("6. ",a)
a={1,2,3,4}
c={1}
a.difference_update(b,c)
print("6. ",a)
# 7.集合使用 discard 方法刪掉資料 val
a={1,2,3,4}
a.discard(2)
print("7. ",a)

4.6  .discard(val)

.discard 方法刪除集合中指定的元素。

4.7  .intersection(set1,set2,...)

.intersection 方法返回集合的交集,自身不受影響。

4.8  .intersection_update()

.intersection 方法原地改變自身為兩個或者多個集合的交集。

>>> a={1,2,3,4,5}
>>> b={2,3,4,5,6,7}
>>> a.intersection(b)
{2, 3, 4, 5}
>>> a
{1, 2, 3, 4, 5}
>>> b
{2, 3, 4, 5, 6, 7}
>>> a.intersection_update(b)
>>> a
{2, 3, 4, 5}
>>> b
{2, 3, 4, 5, 6, 7}

4.9  .isdisjoint()

.isdisjoint 方法判斷兩個集合是否包含相同的元素,如果沒有返回 True,否則返回 False。

>>> a={1,2,3,4,5}
>>> b={2,3,4,5,6,7}
>>> c={"a","b"}
>>> a.isdisjoint(b)
False
>>> a.isdisjoint(c)
True

4.10 .issubset(other_set)

.issubset 方法判斷自身集合是否為該方法引數集合 other_set 的子集。

>>> a={1,2,3,4,5}
>>> b={2,3,4,5,6,7}
>>> c={1}
>>> a.issubset(b)
False
>>> a.issubset(c)
False
>>> c.issubset(a)
True

4.11 .issuperset(other_set)

.issuperset 方法判斷該方法引數集合 other_set 是否為自身集合的子集。

>>> a={1,2,3,4,5}
>>> b={2,3,4,5,6,7}
>>> c={1}
>>> a.issuperset(b)
False
>>> a.issuperset(c)
True

4.12 .pop()

.pop() 方法將返回集合中的一個元素,原集合將刪除該元素。

請注意,集合中的 pop 方法是沒有 index 引數!如果像使用列表中的 pop 方法輸入 index 引數,則返回 TypeError: pop() takes no arguments (1 given) 錯誤。

4.13 .remove()

.remove(val) 方法將刪除集合中的 val 元素,返回為空。如果 val 不在集合中,則返回 KeyError 錯誤。

4.14 .symmetric_difference()

返回兩個集合中不重複的元素集合,而不改變自身集合。

4.15 .symmetric_difference_update()

移除當前集合中在另外一個指定集合相同的元素,並將另外一個指定集合中不同的元素插入到當前集合中。

# 10.集合使用 ^ 操作符返回
#   兩個集合中不一樣的資料
# 等同於 symmetric_difference方法
a={1,2,3,4}
b={4,5,6,7}
tmp=a^b
print("10. ",tmp) 
print("a==>",a)
print("b==>",b)
print("使用 ^ 操作符 原來的集合不受影響")
print("*"*60)
print("a.symmetric_difference(b)==>",a.symmetric_difference(b))
print("a==>",a)
print("b==>",b)
print("使用 symmetric_difference方法 原來的集合不受影響")
print("*"*60)
print("a.symmetric_difference_update(b)==>",a.symmetric_difference_update(b))
print("使用 symmetric_difference_update 原來的集合會改變")
print("a==>",a)
print("b==>",b)
print("*"*60)

4.16 .union(other_set)

.union 方法返回兩個集合的並集,而不改變自身集合。

4.17 .update(other_set)

.update 方法給自身集合集合新增元素。

>>> a={0,1}
>>> b={3,4}
>>> c={5,6}
>>> a.union(b)
{0, 1, 3, 4}
>>> a
{0, 1}
>>> b
{3, 4}
>>> a.update(b)
>>> a
{0, 1, 3, 4}
>>> b
{3, 4}

5. 集合和運運算元

5.1 - 運運算元

a 、b 是兩個集合;a - b類似於 a.difference(b) 方法,即返回集合a中包含而集合b中不包含的元素,自身不受改變。

>>> a={0,1,2,3}
>>> b={2,3,4,5}
>>> a-b
{0, 1}
>>> a.difference(b)
{0, 1}

5.2 | 運運算元

a 、b 是兩個集合;a | b類似於 a.union(b) 方法,即返回集合a和b中所有的元素,自身不受改變。

>>> a={0,1,2,3}
>>> b={2,3,4,5}
>>> a|b
{0, 1, 2, 3, 4, 5}
>>> a.union(b)
{0, 1, 2, 3, 4, 5}

5.3 & 運運算元

a 、b 是兩個集合;a & b類似於 a.intersection(b) 方法,即返回集合a和b中都包含了的元素,自身不受改變。

# 9.集合使用 & 選出集合重疊的部分
#   等同於 insection 方法
a={1,2,3,4}
b={4,5,6,7}
print("*********  初始資料  ***********")
print("a==>",a)
print("b==>",b)
print("8. a & b==>",a & b)
print("執行 a & b 後")
print("a==>",a)
print("b==>",b)
print("使用 & 操作符 原來的集合不受影響")
print("*"*60)
print("8. a.intersection(b)==>",a.intersection(b))
print("使用 intersection 方法 原來的集合不受影響")
print("a==>",a)
print("b==>",b)
print("*"*60)
print("8. a.intersection_update(b)==>",a.intersection_update(b))
print("使用 intersection_update 方法 原來的集合會改變")
print("a==>",a)
print("b==>",b)
print("*"*60)

5.4 ^ 運運算元

a 、b 是兩個集合;a ^ b類似於 a.symmetric_difference(b) 方法,即返回不同時包含於a和b的元素,自身不受改變。

>>> a={0,1,2,3}
>>> b={2,3,4,5}
>>> a.symmetric_difference(b)
{0, 1, 4, 5}
>>> a^b
{0, 1, 4, 5}

5.5 in 、not in 運運算元

in 運運算元判斷某個元素屬於某個集合

not in 運運算元判斷某個元素不屬於某個集合

>>> a={0,1,2,3}
>>> 0 in a
True
>>> "0" in a
False

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容! 


IT145.com E-mail:sddin#qq.com