字典(dict)是容器型数据类型,将{}作为容器的标志,元素用逗号隔开
字典中的元素是键-值对,key:value,缺一不可
{键1:值1, 键2:值2, 键3:值3…}
可变的,无序的(不支持下标操作)
键:任何不可变的数据(理论上),实际一般用字符串作为key,键一定是唯一的
值:任何类型的数据
dict1 = {'name':'John', 'age':18, 'gender':'male'}
写法 | 说明 |
---|---|
字典[key] | 获取字典中指定key对应的值 如果key不存在,则报错 |
字典.get(key) | 获取字典中指定key对应的值 如果key不存在,返回None |
字典.get(key, 默认值) | 获取字典中指定key对应的值 如果key不存在,返回默认值 |
for item in dict1:
...
遍历字典时,遍历的键
原因:
for in循环的原理是先把序列转换为列表,在用下标遍历列表
而字典转换为列表只是把键放在列表里
不建议的遍历方法:
for key, value in dict1.items():
...
这种方法的效率非常低!!!
推荐先遍历键,任何用[键]取值
写法 | 说明 |
---|---|
字典[key] = 值 | 当key存在时,修改指定key对应的值 当key不存在时,添加指定的键-值对 |
写法 | 说明 |
---|---|
del 字典[key] | 删除字典中指定key对应的键-值对 |
字典.pop(key) | 弹出字典中指定key对应的 值 字典中这一对键-值对也会被删除 |
随堂练习:
def solution1(students):
"""第一问解答"""
num = 0
for stu in students:
if stu.get('score') < 60:
num += 1
return num
def solution2(students):
"""第二问解答"""
for stu in students:
if stu.get('age') < 18:
print(stu.get('name'))
def solution3(students):
"""第三问解答"""
for stu in students:
if stu.get('age') > 25:
stu['tel'] = '保密'
return students
==,!=,is
支持上面的三个运算
ps:字典是无序的,== 的结果自悟
不支持+,-,*,/,<,>
判断字典中是否有指定的 键
相当于:
key in 字典 / key not in 字典
写法 | 说明 |
---|---|
len(字典) | 字典的长度,即键-值对的个数 |
dict(数据) | 将指定的数据转化为字典 数据要求: a. 数据本身是序列 b. 序列中的元素也是序列 c. 小序列中的元素有且只有两个,第一个元素不可变 |
list1 = [('name', 'Tom'), ('age', 18), ('gender', 'male')]
dict1 = dict(list1)
print(dict1)
只把 键 取出来作为列表的元素
如果需要保存多个数据,字典和列表的选择:
数据情况 | 容器 |
---|---|
多个数据是相同意义的数据(数据之间不需要区分) | 列表 |
多个数据意义不同(需要区分) | 字典 |
写法 | 说明 |
---|---|
字典.clear() | 清空字典 |
字典.copy() | 拷贝字典,返回新的字典 |
new_dict = dict.fromkeys(序列,值) |
创建新字典: 序列作为key 每个key对应的value均为值 |
字典.items() | 返回字典所有的key和value 返回的数据类型是序列 序列中的元素是两个元素的元组 分别是key和value |
字典.keys() | 返回字典所有的key 返回的数据类型是序列 |
字典.values() | 返回字典所有的value 返回的数据类型是序列 |
字典.setdefault(键, 值) | 字典中添加键-值对 若key已经存在,则不会修改 |
字典1.update(字典2) | 将字典2的所有的键-值对更新到字典1中 |
集合(dict)容器型数据类型,将{}作为容器标志
{元素1, 元素2, 元素3, …}
可变的,无序的(不支持下标操作)
集合中的元素:不可变、唯一(去重)
注意:{}表示空字典,set()才表示空集合
set1 = {1, 2, 'hash', (10, 2)} # 不报错
set2 = {[1, 2], 'hash'} # 报错
因为列表是可变的
for 变量 in 集合:
循环体
写法 | 说明 |
---|---|
集合.add(元素) | 在集合中添加指定元素 |
集合.update(序列) | 将序列中所有的元素更新到集合中 |
写法 | 说明 |
---|---|
集合.remove(元素) | 在集合中删除指定元素 若元素不存在则报错 |
集合.discard(元素) | 在集合中删除指定元素 若元素不存在不会报错 |
没有改(手动滑稽)
同列表
set(序列) - 所有的序列都能转换成集合(元素不可变),自动去重
集合遍历的效率是最高的,远比列表高
并集(|)、交集(&)、差集(-)、对称差集(^)、>/<(包含关系)
运算方法 | 写法 | 说明 |
---|---|---|
并集 | 集合1 | 集合2 | 同数学 |
交集 | 集合1 & 集合2 | 同数学 |
差集 | 集合1 - 集合2 | 同数学 |
对称差集 | 集合1 ^ 集合2 | 并集 - 交集 |
包含 | 集合1 > 集合2 | 判断集合1中是否包含集合2 |
老规矩,先上自己做的,老师答案后面更新
"""
1. 声明一个字典保存一个学生的信息,学生信息中包括:
姓名、年龄、成绩(单科)、电话、性别(男、女、不明)
"""
student1 = {
'name': 'UZI',
'age': 18,
'score': 150,
'tel': '1111111111',
'gender': 'male'
}
"""
2. 声明一个列表,在列表中保存6个学生的信息(6个题1中的字典)
a.统计不及格学生的个数
b.打印不及格学生的名字和对应的成绩
c.统计未成年学生的个数
d.打印手机尾号是8的学生的名字
e.打印最高分和对应的学生的名字
f.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
"""
student2 = {
'name': '777',
'age': 12,
'score': 4396,
'tel': '1111111112',
'gender': 'female'
}
student3 = {
'name': 'Xiao Hu',
'age': 50,
'score': 2200,
'tel': '1111111113',
'gender': 'male'
}
student4 = {
'name': 'The Shy',
'age': 18,
'score': 9999999,
'tel': '1111111118',
'gender': 'God'
}
student5 = {
'name': 'doinb',
'age': 18,
'score': 99999,
'tel': '1111111115',
'gender': 'female'
}
student6 = {
'name': 'Tian',
'age': 12,
'score': 9999,
'tel': '1111111118',
'gender': 'male'
}
students = [student1,
student2,
student3,
student4,
student5,
student6,
]
def solution_a():
"""统计不及格学生个数"""
print('\n==========第一题==========\n')
sum_num = 0
for student in students:
if student['score'] < 4396:
sum_num += 1
return sum_num
print(solution_a())
def solution_b():
"""打印不及格学生的名字对应的成绩"""
print('\n==========第二题==========\n')
for student in students:
if student['score'] < 4396:
print(student['name'] + ' ' + str(student['score']))
solution_b()
def solution_c():
"""统计未成年学生个数"""
print('\n==========第三题==========\n')
sum_num = 0
for student in students:
if student['age'] < 18:
sum_num += 1
return sum_num
print(solution_c())
def solution_d():
"""打印手机号尾号是8的学生的名字"""
print('\n==========第四题==========\n')
for student in students:
if student['tel'][-1] == '8':
print(student['name'])
solution_d()
def solution_e():
"""打印最高分和对应的学生名字"""
print('\n==========第五题==========\n')
max_score = float('-inf')
max_score_player = ''
for student in students:
if student['score'] > max_score:
max_score = student['score']
max_score_player = student['name']
return int(max_score), max_score_player
print(solution_e())
def solution_f():
"""将列表按学生成绩从大到小排序"""
print('\n==========第六题==========\n')
# 依然冒泡排序
for i in range(len(students)):
for j in range(len(students) - i - 1):
if students[j]['score'] < students[j + 1]['score']:
students[j], students[j + 1] = students[j + 1], students[j]
return students
print(solution_f())
def solution_g():
"""删除性别是'God'的学生"""
print('\n==========第七题==========\n')
for student in students[:]:
if student['gender'] == 'God':
students.remove(student)
return students
print(solution_g())
"""
3. 用三个列表表示三门学科的选课学生姓名(一个学生可以同时选多门课)
a. 求选课学生总共有多少人
b. 求只选了第一个学科的人的数量和对应的名字
c. 求只选了一门学科的学生的数量和对应的名字
d. 求只选了两门学科的学生的数量和对应的名字
e. 求选了三门学生的学生的数量和对应的名字
"""
cai = ['UZI', 'baolan', 'sword', 'bang', 'WXZ', '777']
carry = [
'tian',
'the shy',
'doinb',
'crisp',
'faker',
'caps',
'PDD',
'white',
'777',
]
old = [
'777',
'faker',
'UZI',
'PDD',
'white',
'benji',
'big_nose_without_miss',
'koro1',
]
set1 = set(cai)
set2 = set(carry)
set3 = set(old)
def solution2a1():
"""求选课学生共有多少人"""
# 解法1
sum_players = set1.copy()
sum_players.update(carry, old)
return len(sum_players)
print('\n========第二大题的a解法1========\n')
print(solution2a1())
def solution2a2():
"""求选课学生共有多少人"""
# 解法2
return len(set1 | set2 | set3)
print('\n========第二大题的a解法2========\n')
print(solution2a2())
def solution2b1(main_list1, list2, list3):
"""求只选了第一个学科的人的数量和对应的名字"""
# 解法1
sum_players = 0
for player in main_list1:
if player not in list2 and player not in list3:
print(player)
sum_players += 1
return sum_players
print('\n========第二大题的b解法1========\n')
print(solution2b1(cai, carry, old))
def solution2b2():
"""求只选了第一个学科的人的数量和对应的名字"""
# 解法2
cai_player = set1 - set2 - set3
for player in cai_player:
print(player)
print(len(cai_player))
print('\n========第二大题的b解法2========\n')
solution2b2()
def solution2c1():
"""求只选了一门学科的学生的数量和对应的名字"""
# 解法1
num1 = solution2b1(cai, carry, old)
num2 = solution2b1(carry, cai, old)
num3 = solution2b1(old, carry, cai)
print(num1 + num2 + num3)
print('\n========第二大题的c解法1========\n')
solution2c1()
def solution2c2():
"""求只选了一门学科的学生的数量和对应的名字"""
# 解法2
players = (set1 ^ set2 ^ set3) - (set1 & set2 & set3)
for player in players:
print(player)
print(len(players))
print('\n========第二大题的c解法2========\n')
solution2c2()
def solution2d1_fuc1(main_list1, list2, list3):
"""解题辅助函数1"""
players = set()
for player in main_list1:
if (player not in list2 and player in list3) or (
player in list2 and player not in list3):
players.add(player)
return players
def solution2d1():
"""求只选了两门学科的学生的数量和对应的名字"""
# 解法1
players1 = solution2d1_fuc1(cai, carry, old)
players2 = solution2d1_fuc1(carry, cai, old)
players3 = solution2d1_fuc1(old, carry, cai)
players1.update(players2, players3)
for player in players1:
print(player)
print(len(players1))
print('\n========第二大题的d解法1========\n')
solution2d1()
def solution2d2():
""""求只选了两门学科的学生的数量和对应的名字"""
# 解法2
players = ((set1 & set2) | (set2 & set3) | (set1 & set3)) - \
(set1 & set2 & set3)
for player in players:
print(player)
print(len(players))
print('\n========第二大题的d解法2========\n')
solution2d2()
def solution2e1():
"""求选了三门学生的学生的数量和对应的名字"""
sum_num = 0
for player in cai:
if player in carry and player in old:
print(player)
sum_num += 1
return sum_num
print('\n========第二大题的e解法1========\n')
print(solution2e1())
def solution2e2():
"""求选了三门学生的学生的数量和对应的名字"""
players = set1 & set2 & set3
for player in players:
print(player)
print(len(players))
print('\n========第二大题的e解法2========\n')
solution2e2()
# 1.声明一个字典保存一个学生的信息,学生信息包括:姓名,年龄,成绩(单科),电话,性别(男女不明)
stu = {'name': '小明', 'age': 18, 'score': 89, 'tel': '1728272333', 'gender': '男'}
# 2.声明一个列表,在列表中保存6个学生的信息(6个题1中的字典)
students = [
{'name': '小明', 'age': 18, 'score': 93, 'tel': '1728272338', 'gender': '男'},
{'name': '小花', 'age': 30, 'score': 56, 'tel': '1728272335', 'gender': '女'},
{'name': '小红', 'age': 16, 'score': 89, 'tel': '1728272338', 'gender': '不明'},
{'name': 'Tom', 'age': 22, 'score': 93, 'tel': '1728272339', 'gender': '男'},
{'name': '小炮', 'age': 17, 'score': 90, 'tel': '1728272334', 'gender': '女'},
{'name': '托儿索', 'age': 6, 'score': 30, 'tel': '1728272337', 'gender': '男'}
]
print('=============不及格学生===========')
# a.统计不及格学生的个数
# b.打印不及格学生的名字和对应的成绩
count = 0
for stu in students:
score = stu['score']
if score < 60:
count += 1
print(stu['name'], score)
print('不及格学生的个数:' + str(count))
print('==============未成年学生===============')
# c.统计未成年学生的个数
count = 0
for stu in students:
if stu['age'] < 18:
count += 1
print('未成年学生的个数:%d' % count)
# d.打印手机尾号是8的学生的名字
print('手机尾号是8的学生:')
for stu in students:
if stu['tel'][-1] == '8':
print(stu['name'])
print('===============最高分==============')
# e.打印最高分和对应的学生的名字
# 方法一:只获取一个最高分对应的学生
max1 = students[0] # 将第一个学生的分数设置为默认的最高分
for stu in students[1:]:
if stu['score'] > max1['score']:
max1 = stu
print(max1['score'], max1['name'])
# 方法二: 获取同时为最高分的多个学生
# [80, 79, 80, 84, 85, 70, 85]
"""
max_score= 85
max_students = [4, 6]
"""
max_score = students[0]['score'] # 最大分数
max_students = [students[0]['name']] # 最高分对应的所有的学生的名字
for stu in students[1:]:
# 如果分数和最高分相等:就将名字直接添加到列表中
if stu['score'] == max_score:
max_students.append(stu['name'])
# 如果分数大于最高分, 清空原来的最高分对应的名字,添加新的名字
elif stu['score'] > max_score:
max_score = stu['score']
max_students.clear()
max_students.append(stu['name'])
print('最高分{}, 对应的学生有:{}'.format(max_score, str(max_students)[1:-1]))
# f.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
# 方法一: 高阶函数
# students.sort(reverse=True, key=lambda item: item['score'])
# print(students)
# 方法二: 选择排序:
"""
第一轮: 获取整个序列中的最小值放到第一位
第二轮: 从除了第一位以外的元素中选出第二小的值放到第二位
...
"""
# nums = [8, 3, 5, 1]
# 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(students)
for index1 in range(length-1):
for index2 in range(index1+1, length):
if students[index2]['score'] > students[index1]['score']:
students[index1], students[index2] = students[index2], students[index1]
print(students)
# g.删除性别不明的所有学生
for stu in students[:]:
if stu['gender'] == '不明':
students.remove(stu)
print(students)
# 3.用三个列表表示三门学科的选课学生姓名(一个学生可以同时选多门课)
python = {'stu1', 'stu2', 'stu5', 'stu6', 'stu8', 'stu9'}
java = {'stu1', 'stu3', 'stu4', 'stu6'}
h5 = {'stu1', 'stu3', 'stu5', 'stu6', 'stu7', 'stu9'}
# a. 求选课学生总共有多少人
set1 = python | java | h5
print('选课所有学生:', set1)
# b. 求只选了第一个学科的人的数量和对应的名字
set2 = python - java - h5
print('第一个学科的人的名字:', set2)
# e. 求选了三门学生的学生的数量和对应的名字
set3 = python & java & h5
print('选了三门学生的学生:', set3)
# d. 求只选了两门学科的学生的数量和对应的名字
set4 = ((python & java) | (python & h5) | (java & h5)) - set3
print('只选了两门学科的学生:', set4)
# c. 求只选了一门学科的学生的数量和对应的名字
set5 = set1 - set3 - set4
print('只选了一门学科的学生:', set5)