1.什么是集合set
- python內(nèi)置的容器型數(shù)據(jù)類型:可變(支持增刪,不能改),無序(不支持下標(biāo)操作)
- {元素1,元素2,元素3,...}
- 元素要求:不可變;且唯一
set1 ={1,4,3,'abc',1,1}
print(set1) # {'abc', 1, 3, 4} 無序,唯一
2.查
- 集合沒有辦法單獨(dú)取出某一個元素:只能遍歷
for item in set1:
print(item)
3.增
- 集合.add(元素) -- 在集合中添加指定的元素,若元素已經(jīng)存在,無效
set2 = {100,2,5,20,233}
set2.add(200)
print(set2) #{2, 100, 5, 200, 233, 20}
- 集合.update(序列)
set2.update('asb') #將序列中各個元素添加到集合中
print(set2) #{'b', 2, 100, 5, 200, 233, 20, 'a', 's'}
set2.update({'aa':11,'bb':22}) #添加字典中的key
print(set2) #{2, 100, 5, 's', 'b', 200, 233, 'a', 'bb', 'aa', 20}
4.刪
- 集合.romove(元素) -- 刪除集合中指定的元素,元素不存在(報(bào)錯)
set2.remove(200)
print(set2) #{2, 100, 5, 233, 's', 'bb', 'a', 'b', 20, 'aa'}
- 集合.clear() -- 清空集合
set2.clear()
print(set2) #set()
- 空集合 set()
5.改 -- 集合不支持改操作
6.數(shù)學(xué)集合運(yùn)算(集合應(yīng)用的重點(diǎn))
包含與被包含關(guān)系(>= / <=)、并集(|)、交集(&)、差集(-)、補(bǔ)集(^)
a.包含關(guān)系
集合1 >= 集合2 (集合1 <= 集合2) -- 判斷集合1中是否包含集合2...
print({1,2,4,5} >= {1,2,3}) #False
print({1,2,3,4,5} >= {1,2,3}) #True
b.并集
集合1 | 集合2 --將集合1,集合2中元素去重,合并,產(chǎn)生一個新的集合
print({1,2,4,5} | {1,6,7}) #{1, 2, 4, 5, 6, 7}c.交集(&)
集合1 & 集合2 --將集合1,集合2共同含有的元素取出來,合并,產(chǎn)生一個新的集合
print({1,2,4,5} & {1,6,7}) #{1}d. 差集(-)
集合1 - 集合2 -- 集合1中元素除去與集合2共同的元素,剩余的元素產(chǎn)生一個新的集合
print({1,2,4,5} - {1,6,7}) #{2, 4, 5}e.補(bǔ)集(^)
集合1 ^ 集合2 -- 集合1并集合2,減去公共部分,產(chǎn)生一個新的集合
print({1,2,4,5} ^ {1,6,7}) #{2, 4, 5, 6, 7}
7.相關(guān)操作
- in / not in
print(1 in {1,2,4,5} ) #True
set() 轉(zhuǎn)換去重(但會打亂順序),也可以表示空集合
總結(jié):集合的應(yīng)用主要表現(xiàn)在去重和數(shù)據(jù)的集合運(yùn)算
練習(xí):用三個列表表示三門學(xué)科的選課學(xué)生姓名(一個學(xué)生可選多門課)
- 1.求選課學(xué)生總?cè)藬?shù);
- 2.求只選了第一個學(xué)科的學(xué)生數(shù)量
- 3.求只選了一門學(xué)科的學(xué)生數(shù)量
- 4.求只選了兩門學(xué)科的學(xué)生數(shù)量
- 5.求選了三門學(xué)科的學(xué)生數(shù)量
names1_math = ['a','b','d','e','f']
names2_chinese = ['a','c','g','h']
names3_English = ['a','c','d','e','h']
#1
all_names = set(names1_math)|set(names2_chinese)|set(names3_English)
print('學(xué)生總?cè)藬?shù):',len(all_names),all_names)
#2
math_names = set(names1_math)-set(names2_chinese)-set(names3_English)
print('只選了第一個學(xué)科的學(xué)生數(shù)量',len(math_names),math_names)
#3
one_names = (set(names1_math)^set(names2_chinese)^set(names3_English))-((set(names1_math)&set(names2_chinese))&set(names3_English))
print('只選了一門學(xué)科人數(shù)',len(one_names),one_names)
#4
two_names = ((set(names1_math)&set(names2_chinese))|(set(names1_math)&set(names3_English)))^(set(names2_chinese)&set(names3_English))
print('只選了兩門學(xué)科人數(shù)',len(two_names),two_names)
#5
three_names = ((set(names1_math)&set(names2_chinese))&set(names3_English))
print('選了三門學(xué)科人數(shù)',len(three_names),three_names)
歸納總結(jié):
- 1.容器類型
字符串str
列表list
元祖tuple
字典dict
集合set - 2.特點(diǎn)
str 不可變;有序
list 可變,有序
tuple 不可變,有序
dict 可變,無序
set 可變,無序 - 3.值
str: 'www' "11122" (python中的字符串,可以是單引號/雙引號,三個單引號/雙引號(多行字符串))
list: [元素1,元素2,元素3,...] 元素是任何類型的數(shù)據(jù),類型可以不一致,元素可以重復(fù)
tuple (元素1,元素2,元素3,...) 元素是任何類型的數(shù)據(jù),類型可以不一致,元素可以重復(fù)
dict {key1:value1,key2:value1,...} key是不可變且唯一的;value是任何類型的數(shù)據(jù),類型可以不一致,可以重復(fù)
set {元素1,元素2,...} 元素是不可變且唯一的 - 4.增:
list: 列表.append(元素); 列表.insert(下標(biāo),元素)
dict: 字典[key] = 值; 字典.setdefault(key,值)
set : 集合.add(元素) - 5.刪:
list: del 列表[下標(biāo)] , 列表.pop() / 列表.pop(下標(biāo)) ; 列表.remove(元素)
dict: del 字典[key] ; 字典.pop(key)
set: 集合.remove(元素) - 6.改:
list: 列表[下標(biāo)] = 新值
dict: 字典[key] = 新值 - 7.查:
str: 查單個、切片、遍歷
list 查單個、切片、遍歷
tuple 查單個、切片、遍歷
dict 查單個(根據(jù)key,取值)、遍歷(取key)
set 遍歷 - 8.使用
str:單獨(dú)文字?jǐn)?shù)據(jù)使用字符串(除了數(shù)字、bool表示的其他數(shù)據(jù))
list:同時保存多個相同意義數(shù)據(jù)
tuple:多個數(shù)據(jù)的值或者順序不可變(除了一些特殊意義的值以外,一般不用元祖作為容器)
dict:同時保存的多個數(shù)據(jù)需要區(qū)分的時候
set:對其他容器內(nèi)的數(shù)據(jù)去重;或者做數(shù)學(xué)集合運(yùn)算
補(bǔ)充:列表中元素按照一定規(guī)律排序(從小到大)
nums = [1, 5, 6, 2, 3]
length = len(nums)
for index1 in range(length-1):
for index2 in range(index1+1, length):
if nums[index2] < nums[index1]:
nums[index1], nums[index2] = nums[index2], nums[index1]
print(nums) #[1,2,3,5,6]