我的Python学习笔记_Day7 字典、集合

文章目录

  • 字典
      • 1. 什么是字典
      • 2. 字典的增删改查
          • 1) 查
          • 2) 遍历
          • 3) 增 / 改
          • 4) 删
      • 3. 运算
      • 4. in / not in
      • 5. len,dict
      • 6. 字典转列表
      • 7. 字典和列表的选择
      • 8. 字典的其他方法
  • 集合
      • 1. 什么是集合
      • 2. 集合中的元素
      • 3. 集合的增删改查
          • 1) 查
          • 2) 增
          • 3) 删
          • 4) 改
      • 4. 其他相关操作
          • 1) in / not in
          • 2) len,set
          • 3) 程序优化
      • 5. 数学集合运算
  • 作业
  • 作业答案from老师

字典

1. 什么是字典

字典(dict)是容器型数据类型,将{}作为容器的标志,元素用逗号隔开

字典中的元素是键-值对,key:value,缺一不可

{键1:值1, 键2:值2, 键3:值3…}

可变的,无序的(不支持下标操作)

键:任何不可变的数据(理论上),实际一般用字符串作为key,键一定是唯一的

值:任何类型的数据

dict1 = {'name':'John', 'age':18, 'gender':'male'}

2. 字典的增删改查

1) 查
写法 说明
字典[key] 获取字典中指定key对应的值
如果key不存在,则报错
字典.get(key) 获取字典中指定key对应的值
如果key不存在,返回None
字典.get(key, 默认值) 获取字典中指定key对应的值
如果key不存在,返回默认值
2) 遍历
for item in dict1:
    ...

遍历字典时,遍历的键

原因:

for in循环的原理是先把序列转换为列表,在用下标遍历列表
而字典转换为列表只是把键放在列表里

不建议的遍历方法:

for key, value in dict1.items():
    ...

这种方法的效率非常低!!!

推荐先遍历键,任何用[键]取值

3) 增 / 改
写法 说明
字典[key] = 值 当key存在时,修改指定key对应的值
当key不存在时,添加指定的键-值对
4) 删
写法 说明
del 字典[key] 删除字典中指定key对应的键-值对
字典.pop(key) 弹出字典中指定key对应的
字典中这一对键-值对也会被删除

随堂练习:

我的Python学习笔记_Day7 字典、集合_第1张图片

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

3. 运算

==,!=,is

支持上面的三个运算

ps:字典是无序的,== 的结果自悟

不支持+,-,*,/,<,>

4. in / not in

判断字典中是否有指定的

相当于:

key in 字典 / key not in 字典

5. len,dict

写法 说明
len(字典) 字典的长度,即键-值对的个数
dict(数据) 将指定的数据转化为字典
数据要求:
a. 数据本身是序列
b. 序列中的元素也是序列
c. 小序列中的元素有且只有两个,第一个元素不可变
list1 = [('name', 'Tom'), ('age', 18), ('gender', 'male')]
dict1 = dict(list1)
print(dict1)

6. 字典转列表

只把 取出来作为列表的元素

7. 字典和列表的选择

如果需要保存多个数据,字典和列表的选择:

数据情况 容器
多个数据是相同意义的数据(数据之间不需要区分) 列表
多个数据意义不同(需要区分) 字典

8. 字典的其他方法

写法 说明
字典.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中

集合

1. 什么是集合

集合(dict)容器型数据类型,将{}作为容器标志

{元素1, 元素2, 元素3, …}

可变的,无序的(不支持下标操作)

集合中的元素:不可变、唯一(去重)

注意:{}表示空字典,set()才表示空集合

2. 集合中的元素

set1 = {1, 2, 'hash', (10, 2)}  # 不报错
set2 = {[1, 2], 'hash'}  # 报错

因为列表是可变的

3. 集合的增删改查

1) 查

for 变量 in 集合:
循环体

2) 增
写法 说明
集合.add(元素) 在集合中添加指定元素
集合.update(序列) 将序列中所有的元素更新到集合中
3) 删
写法 说明
集合.remove(元素) 在集合中删除指定元素
若元素不存在则报错
集合.discard(元素) 在集合中删除指定元素
若元素不存在不会报错
4) 改

没有改(手动滑稽)

4. 其他相关操作

1) in / not in

同列表

2) len,set

set(序列) - 所有的序列都能转换成集合(元素不可变),自动去重

3) 程序优化

集合遍历的效率是最高的,远比列表高

5. 数学集合运算

并集(|)、交集(&)、差集(-)、对称差集(^)、>/<(包含关系)

运算方法 写法 说明
并集 集合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()

作业答案from老师

# 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)

你可能感兴趣的:(Python学习笔记)