一.什么是集合
python內(nèi)置的容器型數(shù)據(jù)類型. 可變(支持增刪改),無序(不支持下標操作)
{元素1,元素2,元素3,...}
元素要求是不可變并且唯一
set1 = {1, 2, 3, 'abc', 100, 1, 1, (1, 2)}
print(set1, type(set1))
空集合: set()
- 查
集合沒有辦法單獨取出某一個元素;只能遍歷
for item in set1:
print(item)
3.增
集合.add(元素) - 在集合中添加指定的元素
set2 = {100, 2, 5, 20}
set2.add(200)
print(set2)
集合.update(序列) - 將序列中的元素添加到集合中
set2.update('abc')
print(set2) # {2, 'c', 100, 5, 'a', 20, 'b'}
- 刪
集合.remove(元素) - 刪除集合中指定元素,元素不存在會報錯
set2 = {100, 2, 5, 20}
set2.remove(100)
print(set2)
集合.clear() - 清空集合
set2.clear()
print(set2)
- 改(集合不支持改操作)
6.數(shù)學集合運算(集合應(yīng)用的重點)
包含關(guān)系(>=, <=)蛇损、并集()英岭、交集灵妨、差集胆描、補集
# 1)包含關(guān)系
# 集合1 >= 集合2 - 判斷集合1中是否包含集合2
# 集合1 <= 集合2 - 判斷集合2中是否包含集合1
print({100, 2, 3, 200, 300, 400, 1} >= {1, 2, 3})
# 2)并集(|)
# 集合1 | 集合2 - 將集合1和集合2中的元素合并在一起產(chǎn)生新的集合(會去重)
set1 = {1, 2, 3, 4, 5}
set2 = {1, 2, 3, 8, 9, 10}
print(set1 | set2
# 交集(&)
# 集合1 & 集合2
print(set1 & set2)
# 差集(-)
# 集合1 - 集合2 - 集合1中除了和集合2公共的元素以外的元素
print(set1 - set2)
# 補集(^)
print(set1 ^ set2)
7.相關(guān)的操作
in / not in
set()
總結(jié):集合的應(yīng)用主要表現(xiàn)在去重和數(shù)據(jù)集合運算
# 練習: 用三個列表表示三門學科的選課學生姓名(一個學生可以同時選多門課),
# 1. 求選課學生總共有多少人
# 2. 求只選了第一個學科的人的數(shù)量和對應(yīng)的名字
# 3. 求只選了一門學科的學生的數(shù)量和對應(yīng)的名字
# 4. 求只選了兩門學科的學生的數(shù)量和對應(yīng)的名字
# 5. 求選了三門學生的學生的數(shù)量和對應(yīng)的名字
names1 = ['name1', 'name2', 'name3', 'name4', 'name5', 'name6']
names2 = ['name1', 'name2', 'name7', 'name8', 'name9', 'name10']
names3 = ['name2', 'name3', 'name4', 'name7', 'name11', 'name12']
total0 = set(names1) | set(names2) | set(names3)
print('選課學生總共有多少人:%d' % len(total0))
total = set(names1) - set(names2) - set(names3)
total = set(names1) - (set(names2) | set(names3))
print('只選了第一個學科的人的數(shù)量:%d,對應(yīng)的名字:%s' % (len(total), str(total)[1:-1]))
total1 = (set(names1) ^ set(names2) ^ set(names3)) - (set(names1) & set(names2) & set(names3))
print('只選了一門學科的學生的數(shù)量:%d, 對應(yīng)的名字:%s' % (len(total1), str(total1)[1:-1]))
# 所有學生 - 只選了一科的學生 - 選了三科的學生
total2 = total0 - total1 - (set(names1) & set(names2) & set(names3))
print('只選了兩門學科的學生的數(shù)量:%d, 對應(yīng)的名字:%s' % (len(total2), str(total2)[1:-1]))
total3 = set(names1) & set(names2) & set(names3)
print('選了三門學科的學生的數(shù)量:%d, 對應(yīng)的名字:%s' % (len(total3), str(total3)[1:-1]))
二.container(容器)
"""
1.容器類型:字符串(str)倒槐、列表(list)、元祖(tuple)鹰霍、字典(dict)豹休、集合(set)
2.特點
str: 不可變镜沽、有序
list: 可變敏晤、有序
tuple: 不可變、有序
dict: 可變缅茉、無序
set: 可變嘴脾、無序
3.值
str: "hsj護士節(jié)",'\naa\t123\'aaa\"345\\' , '\u3467' '\u3fd3' '%c' % (0x4eff)
(python中的字符串,可以是單引號蔬墩、雙引號或者三個單引號译打、三個雙引號)
list: [元素1, 元素2,...] , 元素可以是任何類型的數(shù)據(jù),類型可以不一致拇颅,元素可以重復(fù)
tuple: (元素1, 元素2,...) , 元素可以是任何類型的數(shù)據(jù)奏司,類型可以不一致,元素可以重復(fù)
dict: {key1: value1, key2: value2, ...}, key是不可變的樟插,唯一的韵洋; value可以是任何類型的數(shù)據(jù),類型可以不一致黄锤,可以重復(fù)
set: {元素1, 元素2, ...} , 元素是不可變的搪缨,唯一的
4.增
list: 列表.append(元素) 、列表.insert(下標, 元素)
dict: 字典[key] = 值 鸵熟、 字典.setdefault(key,值)
set: 集合.add(元素)
5.刪
list: del 列表[下標] 副编、 列表.pop()\列表.pop(下標) 、列表.remove(元素)
dict: del 字典[key] 流强、 字典.pop(key)
set: 集合.remove(元素)
6.改
list: 列表[下標] = 新值
dict: 字典[key] = 新值
7.查
str: 查單個(下標)痹届、切片、遍歷
list: 查單個(下標)打月、切片短纵、遍歷
tuple: 查單個(下標)、切片僵控、遍歷
dict: 查單個(key)香到、遍歷(遍歷拿到key)
set: 遍歷
8.使用
str: 單獨文字數(shù)據(jù)使用字符串(除了數(shù)字、和布爾表示的其他數(shù)據(jù))
list: 保存多個具有相同意義的數(shù)據(jù)
tuple: 多個數(shù)據(jù)的值或者順序不能變的時候使用元祖(除了一些特殊意義的值报破,類似星期悠就,一般不會選擇用元祖來作為容器)
dict : 同時保存的多個數(shù)據(jù)需要區(qū)分的時候
set:對其他容器中的數(shù)據(jù)去重,或者做數(shù)學集合運算
"""
三.作業(yè)評講(列表)
# 1.已知一個數(shù)字列表充易,求列表中心元素梗脾。
nums = [1, 2, 3, 4, 5, 10, 11]
length = len(nums)
if length % 2 == 0:
print(nums[length//2], nums[length//2-1])
else:
print(nums[length//2])
"""
[1,2,3,4] 1, 2 --- 4
[1, 2, 3, 4, 5, 6] 2,3 --- 6
[1, 2, 3] 1 -- 3
"""
# 2.已知一個數(shù)字列表,求所有元素和盹靴。
print(sum(nums))
# 3.已知一個數(shù)字列表炸茧,輸出所有奇數(shù)下標元素瑞妇。
print(nums[1::2])
# 4.已知一個數(shù)字列表,輸出所有元素中梭冠,值為奇數(shù)的辕狰。
for num in nums:
if num % 2 == 1:
print(num)
# 5.已知一個數(shù)字列表,將所有元素乘二控漠。
nums = [1, 2, 3, 4, 5, 10, 11]
# nums = [2, 4, 6, 8, 10, 20, 22]
# 列表[下標] = 值
for index in range(len(nums)):
nums[index] *= 2 # nums[index] = nums[index] * 2
print(nums)
# 6.有一個長度是10的列表蔓倍,數(shù)組內(nèi)有10個人名,要求去掉重復(fù)的
# 方法一:用集合
names = ['張三', '李四', '大黃', '張三']
names = list(set(names))
print(names)
names = ['張三', '張三', '李四', '大黃', '張三']
for name in names[:]:
if names.count(name) > 1:
names.remove(name)
print(names)
# 7.已經(jīng)一個數(shù)字列表(數(shù)字大小在0~65535之間), 將列表轉(zhuǎn)換成數(shù)字對應(yīng)的字符列表
# 例如: list1 = [97, 98, 99] -> list1 = ['a', 'b', 'c']
nums = [60, 78, 89, 0x4fff, 0x78ef, 120, 67]
for index in range(len(nums)):
nums[index] = chr(nums[index])
print(nums)
# 8.用一個列表來保存一個節(jié)目的所有分數(shù)盐捷,求平均分數(shù)(去掉一個最高分偶翅,去掉一個最低分,求最后得分)
scores = [89, 99, 87, 70, 64, 10]
print((sum(scores) - max(scores) - min(scores)) / (len(scores) - 2))
# 9.有另個列表A和B碉渡,使用列表C來獲取兩個列表中公共的元素
# 例如: A = [1, 'a', 4, 90, 1] B = ['a', 8, 'j', 1] --> C = [1, 'a']
A = [1, 'a', 4, 90, 1]
B = ['a', 8, 'j', 1]
C = list(set(A) & set(B))
print(C)
C = []
for item in A:
if (item in B) and (item not in C):
C.append(item)
print(C)
四.作業(yè)評講(字典)
# 1.聲明一個字典保存一個學生的信息聚谁,學生信息中包括: 姓名、年齡滞诺、成績(單科)垦巴、電話
student = {
'name': '張三',
'age': 28,
'score': 89,
'tel': '18273923883'
}
print(student)
# 2.聲明一個列表,在列表中保存6個學生的信息(6個題1中的字典)
all_students = [
{'name': '張三', 'age': 28, 'score': 89, 'tel': '18273923883'},
{'name': '小明', 'age': 18, 'score': 99, 'tel': '15382933980'},
{'name': 'Lucy', 'age': 28, 'score': 99, 'tel': '18273923818'},
{'name': '路飛', 'age': 17, 'score': 78, 'tel': '15382933982'},
{'name': 'Mike', 'age': 22, 'score': 40, 'tel': '18273923838'},
{'name': 'Tom', 'age': 16, 'score': 90, 'tel': '15382933981'},
]
print('==============第a,b,c題==============')
count = 0 # 不及格人數(shù)
count2 = 0 # 未成年人數(shù)
for stu_dict in all_students:
# a.統(tǒng)計不及格學生的個數(shù)
# b.打印不及格學生的名字和對應(yīng)的成績
if stu_dict['score'] < 60:
print('%s: %d' % (stu_dict['name'], stu_dict['score']))
count += 1
# c.統(tǒng)計未成年學生的個數(shù)
if stu_dict['age'] < 18:
count2 += 1
# d.打印手機尾號是8的學生的名字
if stu_dict['tel'][-1] == '8':
print('%s的手機號:%s' % (stu_dict['name'], stu_dict['tel']))
print('不及格學生人數(shù): %d' % count)
print('未成年學生人數(shù): %d' % count2)
# e.打印最高分和對應(yīng)的學生的名字
max_score = 0
for stu_dict in all_students:
if stu_dict['score'] > max_score:
max_score = stu_dict['score']
for stu_dict in all_students:
if stu_dict['score'] == max_score:
print(stu_dict['name'], max_score)
# f.將列表按學生成績從大到小排序(掙扎一下铭段,不行就放棄)
all_students.sort(key=lambda x: x['age'], reverse=True)
print(all_students)
# 選擇排序
# 1骤宣, 5 ,6 序愚,2憔披,3 --> 1, 2, 3,5,6
"""
nums = [1, 5, 6, 2, 3]
[1, 5, 6, 2, 3]
[1, 2, 6, 5, 3]
[1, 2, 3, 6, 5]
[1, 2, 3 5, 6]
"""
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)
length = len(all_students)
for index1 in range(length-1):
for index2 in range(index1+1, length):
if all_students[index2]['score'] < all_students[index1]['score']:
all_students[index1], all_students[index2] = all_students[index2], all_students[index1]
print(all_students)