Python 集合
集合
-
集合是容器:将{}作为容器标志,多个元素用逗号隔开 -
集合是可变的; -
集合是无序的; -
元素:不可变的数据、元素是唯一的(具备自动去重的功能) -
集合的操作
-
查 - 遍历 for 元素 in 集合:
循环体
nums = {23, 90, 89, 78}
for x in nums:
print(x, end=' ')
[Out]
89 90 78 23
-
增
- 集合.add(元素) - 在集合中添加指定元素
- 集合.update(序列) - 将序列中的元素全部添加到集合中
nums = {23, 90, 89, 78}
nums.add(45)
print(nums)
nums.update('abc')
print(nums)
[Out]
{45, 78, 23, 89, 90}
{'c', 45, 78, 23, 89, 90, 'a', 'b'}
-
删
- 集合.remove(元素) - 删除指定元素,如果元素不存在,会报错
- 集合.discard(元素) - 删除指定元素,如果元素不存在,不会报错
nums = {23, 90, 89, 78}
nums.remove(89)
print(nums)
nums.discard(90)
print(nums)
[Out]
{90, 78, 23}
{78, 23}
-
改 集合无法直接修改元素的值,如果非要改,就要改的元素删除,添加新的元素 -
数学集合运算 nums1 = {1, 2, 3, 4, 5, 6, 7}
nums2 = {5, 6, 7, 8, 9}
-
集合1 & 集合2 - 获取两个集合的公共元素 print(nums1 & nums2)
[Out]
{5, 6, 7}
-
集合1 | 集合2 - 两个集合所包含的所有元素 print(nums1 | nums2)
[Out]
{1, 2, 3, 4, 5, 6, 7, 8, 9}
-
集合1 - 集合2 - 获取集合1中除了包含在集合2中的元素 print(nums1 - nums2)
[Out]
{1, 2, 3, 4}
-
集合2 - 集合1 - 获取集合2中除了包含在集合1中的元素 print(nums2 - nums1)
[Out]
{8, 9}
-
集合1 ^ 集合2 - 将两个集合合并,去掉中间公共部分 print(nums1 ^ nums2)
[Out]
{1, 2, 3, 4, 8, 9}
-
集合1 > 集合2 -> 判断集合2是否是集合1的真子集 print({10, 20, 30} > {1, 2})
print({10, 20, 30, 40} > {10, 30})
print({10, 20, 30, 40} > {10, 20, 30, 40})
[Out]
False
True
False
-
集合1 >= 集合2 -> 判断集合2是否是集合1的子集 print({10, 20, 30, 40} >= {10, 20, 30, 40})
[Out]
True
练习
-
定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) ) students = [
{'name': 'stu1', 'age': 18, 'score': 98, 'tel': '1123', 'gender': 'male'},
{'name': 'stu2', 'age': 28, 'score': 76, 'tel': '8999', 'gender': 'female'},
{'name': 'stu3', 'age': 20, 'score': 53, 'tel': '678', 'gender': None},
{'name': 'stu4', 'age': 22, 'score': 98, 'tel': '667', 'gender': 'male'},
{'name': 'stu5', 'age': 32, 'score': 80, 'tel': '892', 'gender': None},
{'name': 'stu6', 'age': 17, 'score': 56, 'tel': '431', 'gender': 'female'}
]
-
统计不及格学生的个数 count = 0
for i in students:
if i.get('score') < 60:
count += 1
print(count)
-
打印不及格学生的名字和对应的成绩 for i in students:
stu_score = i.get('score')
if stu_score < 60:
print(i.get('name'), stu_score)
-
打印手机尾号是8的学生的名字 for i in students:
if int(i.get('tel')) % 10 == 8:
print(i.get('name'))
-
打印最高分和对应的学生的名字 max_score = 0
for i in students:
stu_score = i.get('score')
if stu_score > max_score:
max_score = stu_score
else:
for i in students:
score = i.get('score')
if score == max_score:
print(score, i.get('name'))
-
删除性别不明的所有学生 index = 0
while index < len(students):
if students[index].get('gender') == None:
del students[index]
continue
index += 1
print(students)
-
将列表按学生成绩从大到小排序(挣扎一下,不行就放弃) count = len(students)
for i in range(1, count):
for j in range(i):
if students[i].get('score') > students[j].get('score'):
students[i], students[j] = students[j], students[i]
print(students)
-
用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课) Chinese = {'stu1', 'stu3', 'stu4', 'stu5', 'stu7', 'stu8'}
Math = {'stu1', 'stu2', 'stu3', 'stu6', 'stu8'}
English = {'stu2', 'stu3', 'stu4'}
-
求选课学生总共有多少人 set1 = Chinese | Math | English
print('总人数为:', len(set1))
-
求只选了第一个学科的人的数量和对应的名字 set2 = Chinese - (Math | English)
print(len(set2), set2)
-
求只选了一门学科的学生的数量和对应的名字 set3 = (Chinese ^ Math ^ English) - (Chinese & Math & English)
print(len(set3), set3)
-
求只选了两门学科的学生的数量和对应的名字 set4 = (Chinese | Math | English) - (Chinese ^ Math ^ English)
print(len(set4), set4)
-
求选了三门学生的学生的数量和对应的名字 set5 = Chinese & Math & English
print(len(set5), set5)
|