【千锋Python2205班9.27笔记-day07-字典(一阶段)】

在这里插入图片描述

01-review

# 1. 遍历列表
nums = [19, 82, 67, 65, 73, 60]

for x in nums:
    print(x)

print('------------------------------------------华丽的分割线------------------------------------------------')
for x in range(len(nums)):
    print(x, nums[x])

print('------------------------------------------华丽的分割线------------------------------------------------')
for x1, x2 in enumerate(nums):
    print(x1, x2)

# 2.增
nums.append(100)
print(nums)     # [19, 82, 67, 65, 73, 60, 100]

nums.insert(0, 200)
print(nums)     # [200, 19, 82, 67, 65, 73, 60, 100]

nums.extend([11, 22, 33])
print(nums)

# 3.删
nums = [200, 19, 82, 67, 65, 73, 60, 100, 11, 22, 33]
del nums[1]
print(nums)     # [200, 82, 67, 65, 73, 60, 100, 11, 22, 33]

nums.remove(82)
print(nums)     # [200, 67, 65, 73, 60, 100, 11, 22, 33]

result = nums.pop()
print(nums, result)

result = nums.pop(0)
print(nums, result)

# 4.改
nums = [200, 67, 65, 73, 60, 100, 11, 22, 33]
nums[2] = 650
print(nums)

# 5.相关操作
print([10, 20] + [100, 200, 300])
print([10, 20] * 3)

print([10, 20, 30] == [10, 30, 20])
print([10, 3, 8000] > [10, 4])

print(89 in [10, 20, 30])
print(89 not in [10, 20, 30])

# 6.相关函数
# max、min、sum、sorted、len、list

# 7.相关方法
# 列表.xxx()


# 8.列表推导式
# [表达式 for 变量 in 序列]
# [表达式 for 变量 in 序列 if 条件语句]

02-homework

# 1.已知一个数字列表,打印列表中所有的奇数
# nums = [90, 83, 62, 77, 59, 81]
# for x in nums:
#     if x % 2 != 0:
#         print(x)


# 2.已知一个数字列表,打印列表中所有能被能被3整除但是不能被2整除的数
# nums = [90, 83, 62, 77, 59, 81]
# for x in nums:
#     if x % 3 == 0 and x % 2 != 0:
#         print(x)

# 3.已知一个数字列表,计算所有偶数的和
nums = [90, 83, 62, 77, 59, 81]
# 方法1:
sum1 = 0
for x in nums:
    if x % 2 == 0:
        sum1 += x
print(sum1)

# 方法2:
# [90, 62]
result = [x for x in nums if x % 2 == 0]
print(sum(result))

print('------------------------------------------华丽的分割线------------------------------------------------')

# 4.已知一个数字列表,统计列表中十位数是1的数的个数
nums = [90, 83, 62, 717, 59, 81]
count = 0
for x in nums:
    if x // 10 % 10 == 1:
        count += 1
print(count)


# 5.已知一个列表,获取列表中下标为奇数是所有元素(从0开始的下标值)
nums = [90, 90, 62, 717, 59, 81]
# [90, 717, 81]
# 方法1:
print(nums[1::2])

# 方法2:
result = [item for index, item in enumerate(nums) if index % 2 != 0]
print(result)

# 6.已知一个数字列表,将列表中所有元素乘以2
print('------------------------------------------华丽的分割线------------------------------------------------')
nums = [10, 3, 6, 12]
# 方法1:
result = [x*2 for x in nums]
print(result, nums)

# 方法2
nums = [10, 3, 6, 12]
for index in range(len(nums)):
    # nums[index]  = nums[index] * 2
    nums[index] *= 2
print(nums)

# 7.已知一个列表,获取列表的中心元素
"""
奇数个:
7  - 3
5  -  2
3  -  1`
N  ->  N//2

偶数个:
8  -  3,4
6  -  2,3
4  -  1,2
N  -  N//2-1, N//2
"""
print('------------------------------------------华丽的分割线------------------------------------------------')
nums = [10, 2, 6, 12, 10,12, 90]
length = len(nums)
if length % 2 != 0:
    print(nums[length//2])
else:
    print(nums[length//2 - 1], nums[length//2])

# 8.已知一个列表,获取列表中所有的整型元素
print('------------------------------------------华丽的分割线------------------------------------------------')
list1 = [10, 1.23, 'abc', True, 100,  'hello', '20', 5]
# [10, 100, 5]
result = [x for x in list1 if type(x) == int]
print(result)

# 9.定义一个列表保存多个学生的分数,删除列表中所以低于60分的值
# 方法1:
scores = [45, 60, 89, 30, 12, 59, 99, 80, 71, 66]
for x in scores[:]:
    if x < 60:
        scores.remove(x)
print(scores)

# 方法2:
scores = [45, 60, 89, 30, 12, 59, 99, 80, 71, 66]
# [60, 89, 99, 80, 71, 66]
result = [x for x in scores if x >= 60]
print(result)

# 10.已知一个列表保存了多个学生的姓名,要求去掉列表中重复的名字
print('------------------------------------------华丽的分割线------------------------------------------------')
# 方法1:
names = ['小明', '张三', '李四', '张三', '张三', '小明', '王五', '王五']
new_names = []
for x in names:
    if x not in new_names:
        new_names.append(x)
print(new_names)

# 方法2:
names = ['小明', '张三', '李四', '张三', '张三', '小明', '王五', '王五']
"""
['张三', '李四', '张三', '张三', '小明', '王五', '王五']   '小明'
['李四', '张三', '张三', '小明', '王五', '王五']    '张三'
['张三', '张三', '小明', '王五', '王五']      '李四'   -> ['张三', '张三', '小明', '王五', '王五', '李四'] 
['张三', '小明', '王五', '王五', '李四']  '张三'
['小明', '王五', '王五', '李四']       '张三'   -> ['小明', '王五', '王五', '李四', '张三'] 
['王五', '王五', '李四', '张三']        '小明'  -> ['王五', '王五', '李四', '张三', '小明'] 
['王五', '李四', '张三', '小明']      '王五'
['李四', '张三', '小明']  '王五'   ->  ['李四', '张三', '小明', '王五' ]
"""
for x in range(len(names)):
    name = names.pop(0)
    if name not in names:
        names.append(name)
print(names)

# 11.已知两个有序列表(列表中的元素已经按照从小到大的方式排好序),要求合并两个列表,合并后元素还是从小到大排序
list1 = [10, 23, 39, 41, 52, 55, 80, 99, 100]
list2 = [9, 38,  55, 70]

# 方法1:
print(sorted(list1 + list2))

# 方法2:
result = []
while True:
    a = list1.pop(0)
    b = list2.pop(0)
    if a < b:
        result.append(a)
        list2.insert(0, b)
    else:
        result.append(b)
        list1.insert(0, a)
    if list1 == [] or list2 == []:
        break
result += list1 + list2
print(result)

# 12. 已知一个有序数字列表(从小到大),输入任意一个数字,将输入的数字插入列表中,要求插入后列表仍然保持从小到大排序的关系
list1 = [10, 23, 45, 67, 91]
# 18
# num = int(input('请输入一个数:'))
# for index in range(len(list1)):
#     if list1[index] > num:
#         list1.insert(index, num)
#         break
# else:
#     list1.append(num)
#
# print(list1)

# 13.利用列表推导式删除列表中整数个位数小于5的元素
lis = [13, 1.23, 'abc', True, 100, 93, 'hello', '20', 5]
# [1.23, 'abc', True, ....]

result = [x for x in lis if type(x) != int or x % 10 >= 5]
print(result)

result = [x for x in lis if not (type(x) == int and x % 10 < 5)]
print(result)

# 14. 利用列表推导式获取元素是元组的列表中每个元组的最后一个元素
lis1 = [(10, 20, 30), ('abc', 'hello'), (1, 2, 3.4), (True, False)]
# [30, 'hello', 3.4, False]
# (10, 20, 30) -> 30
result = [x[-1] for x in lis1]
print(result)


# 15.利用列表推导式将数字列表中所有的奇数乘以2,所有的偶数除以2
nums = [23, 4, 67, 88, 90, 21]
# [46, 2, 134, 44, 45, 42]
result = [x // 2 if x % 2 == 0 else x * 2 for x in nums]
print(result)

03-认识字典

# 1. 字典的作用
# 需求:定义一个变量保存一个学生的信息
stu = ['小明', 32, '电子信息', 170, 80, 90]
print(stu[1])

stu = {
    'name': '小明',
    'age': 32,
    '专业': '电子信息',
    'height': 170,
    'weight': 80,
    'score': 90
}
print(stu['age'])

# 2. 字典和列表的选择
"""
如果要保存多个意义不同的数据,就使用字典;要保存多个意义相同的数据就用列表
"""

# 3.什么是字典(dict)
"""
字典是系统类型,属于容器型数据类型(序列);
将{}作为容器的标志,里面多个键值对(元素)用逗号隔开: {键1:值1, 键2:值2, 键3:值3, ...}

字典是可变(支持增删改);字典是无序(不支持下标操作;顺序不影响结果)

键  -  键必须是不可变类型的数据(数字、字符串、布尔、空值、元组); 键唯一(同一个字典中同一个键只能出现一次)
值  -  没有要求(任何类型的数据)
"""
# 字典无序
print({'a': 10, 'b': 20} == {'b': 20, 'a': 10})     # True

# 键不可变
dict1 = {10: 20, 'a': 30, (10, 20): 40}
# dict2 = {10: 20, 'a': 30, [10, 20]: 40}       # 报错

# 键唯一
dict3 = {'a': 10, 'b': 20, 'a': 30}
print(dict3)        # {'a': 30, 'b': 20}

# 空字典
dict4 = {}

04-字典的查操作

# 字典存储数据真正想要保存的是值,键只是用来对值进行区分和说明的(相当于列表中元素的下标)

# 1. 查单个  -  获取单个值
"""
1)字典[键]         -   获取字典中指定键对应的值,如果键不存在程序会报错
2)字典.get(键)     -   获取字典中指定键对应的值,如果键不存在不会报错并且会返回None
3)字典.get(键, 默认值)   -  获取字典中指定键对应的值,如果键不存在不会报错并且会返回默认值
"""
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}

print(dog['type'])
print(dog['name'])
# print(dog['weight'])        # KeyError: 'weight'

print(dog.get('price'))
print(dog.get('color'))
print(dog.get('weight'))        # None

print(dog.get('age', 0))
print(dog.get('color', '白色'))
print(dog.get('weight', 5))         # 5

# 2.生活中列表和字典
# 需求:结合实际定义一个变量保存一个班级的信息
# 班级信息:班级名、教室、讲师、班主任、学生
class1 = {
    'className': 'Python2205',
    'classRoom': '11教',
    'lecturer': {'name': '余婷', 'age': 18, 'tel': '13678192302', 'gender': '女'},
    'classTeacher': {'name': '燕子姐', 'age': 18, 'tel': '119', 'QQ': '8282821'},
    'students': [
        {'name': 'stu1', 'age': 19, 'tel': '1922333', 'gender': '男', 'linkman': {'name': '张三', 'tel': '11923'}},
        {'name': 'stu2', 'age': 28, 'tel': '8727832', 'gender': '男', 'linkman': {'name': '小明', 'tel': '19202'}},
        {'name': 'stu3', 'age': 30, 'tel': '291912', 'gender': '女', 'linkman': {'name': '李四', 'tel': '1910283'}},
        {'name': 'stu4', 'age': 17, 'tel': '2349183', 'gender': '男', 'linkman': {'name': '老王', 'tel': '109221567'}},
        {'name': 'stu5', 'age': 16, 'tel': '27273482', 'gender': '女', 'linkman': {'name': '王五', 'tel': '119283427'}},
        {'name': 'stu6', 'age': 22, 'tel': '1242402', 'gender': '男', 'linkman': {'name': '赵六', 'tel': '2091834'}}
    ]
}
# 1)获取班级名称
print(class1['className'])

# 2)获取讲师的名字和电话
teacher = class1['lecturer']
print(teacher['name'], teacher['tel'])

# 3)获取班主任的名字和QQ
print(class1['classTeacher']['name'], class1['classTeacher']['QQ'])

# 4)打印所有学生的名字
result = [x['name'] for x in class1['students']]
print(result)

for stu in class1['students']:
    print(stu['name'])

# 5)计算所有男生的平均年龄
total_age = count = 0
for stu in class1['students']:
    if stu['gender'] == '男':
        total_age += stu['age']
        count += 1
print('男生的平均年龄:', total_age / count)


# 6)打印所有女学生的联系人的电话
for stu in class1['students']:
    if stu['gender'] == '女':
        print(stu['linkman']['tel'])


# 3.遍历字典  - 一个一个的获取字典所有的值
"""
方法1:
for 变量 in 字典:
    循环体(变量获取到的是字典的键)
    
方法2:
for 变量1,变量2 in 字典.items():
    循环体(变量1依次取到的是所有的键,变量2依次取到的是所有的值)
"""
print('------------------------------------------华丽的分割线------------------------------------------------')
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
for x in dog:
    print(x, dog[x])

print('------------------------------------------华丽的分割线------------------------------------------------')
for key, value in dog.items():
    print(key, value)

05-字典的增删改

# 1.增(添加键值对)、改(修改某个键对应的值)
"""
1)字典[键] = 值     -   如果键不存在就添加键值对;如果键存在就修改指定键对应的值
2)字典.setdefault(键, 值)       -   添加键值对(只会在键不存在的时候实现添加的功能,键存在无作为)
"""
stu = {'name': '小明', 'age': 18, 'height': 177}
print(stu)

stu['weight'] = 70
print(stu)      # {'name': '小明', 'age': 18, 'height': 177, 'weight': 70}

stu['age'] = 28
print(stu)      # {'name': '小明', 'age': 28, 'height': 177, 'weight': 70}

print('------------------------------------------华丽的分割线------------------------------------------------')
stu = {'name': '小明', 'age': 18, 'height': 177}

stu.setdefault('weight', 80)
print(stu)

stu.setdefault('age', 30)
print(stu)

# 案例:给没有折扣的商品添加折扣值为1
goods = [
    {'name': '火腿肠', 'price': 1.5, 'count': 53, 'discount': 0.9},
    {'name': '泡面', 'price': 3.5, 'count': 100},
    {'name': '矿泉水', 'price': 1, 'count': 135},
    {'name': '面包', 'price': 5.5, 'count': 10, 'discount': 0.75}
]
for x in goods:
    x.setdefault('discount', 1)
print(goods)


# 2.删  - 删除键值对
# 1)del 字典[键]       -       删除指定键对应的键值对
print('------------------------------------------华丽的分割线------------------------------------------------')
stu = {'name': '小明', 'age': 18, 'height': 177, 'gender': '男'}
del stu['height']
print(stu)      # {'name': '小明', 'age': 18, 'gender': '男'}

# 2)字典.pop(键)       -       取出字典中指定键对应值并且返回
stu = {'name': '小明', 'age': 18, 'height': 177, 'gender': '男'}
result = stu.pop('gender')
print(stu, result)      # {'name': '小明', 'age': 18, 'height': 177} 男

06-字典的相关操作和函数

# 1. 字典不支持+、*和比较大小,只支持比较是否相等
# 2. in 和 not in        -       判断字典中是否存在指定键
"""
键 in 字典
键 not in 字典
"""
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(3 in dog)     # False
print('name' in dog)        # True

# 3.len
print(len(dog))

# 4.dict
"""
dict(数据)        -       将指定数据转换成字典
数据的要求:1)数据本身是一个大序列
          2)大序列中的每个元素是有且只有两个元素的小序列,并且小序列中的第一个元素是不可变类型的数据
"""
data1 = ['ab', [10, 20], '10']
print(dict(data1))      # {'a': 'b', 10: 20, '1': '0'}

data2 = [('age', 20), ('name', '张三'), ('gender', '男')]
print(dict(data2))      # {'age': 20, 'name': '张三', 'gender': '男'}

07-字典相关方法

# 字典.xxx()

# 1.字典.clear()  - 清空字典
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
dog.clear()
print(dog)

# 2.字典.copy()   -   复制字典产生一个一模一样的新字典,并且将新的字典返回
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
dog1 = dog.copy()
print(dog1)

# 3.
"""
字典.keys()       -       获取字典所有的键并且返回
字典.values()     -       获取字典所有的值并且返回
字典.items()      -       将字典中的每个键值对转换一个一个的元组作为序列中的元素返回
"""
print(dog.keys())       # dict_keys(['name', 'age', 'type', 'price', 'color'])
print(dog.values())     # dict_values(['旺财', 3, '土狗', 30000, '黄色'])
print(dog.items())      # dict_items([('name', '旺财'), ('age', 3), ('type', '土狗'), ('price', 30000), ('color', '黄色')])

# 4.字典1.update(字典2)     -       将字典2中的键值对全部添加到字典1中
dog.update({'a': 10, 'b': 20, 'age': 10})
print(dog)

08-拷贝问题

# 拷贝  -  复制数据产生一个一模一样的新数据
# 1. 直接赋值和拷贝的区别
a = [10, 20, 30, 40]
b = a      # 直接赋值赋的是地址
print(b)

c = a.copy()        # 拷贝是赋值原数据产生一个一模一样的新数据,并且将新的数据的地址返回
print(c)

a.append(100)
print('a:', a)
print('b:', b)
print('c:', c)

print('------------------------------------------华丽的分割线------------------------------------------------')
# 2.浅拷贝和深拷贝
from copy import copy, deepcopy
# 浅拷贝:列表.copy()、字典.copy()、列表[:]、copy(可变数据)   (只拷贝对象本身,对象中的子对象不拷贝)
# 深拷贝:deepcopy(可变数据)        (既拷贝对象本身,也会拷贝对象中的子对象)
list1 = [10, 20, 30, 40]

list2 = copy(list1)     # list2 = list1.copy();  list2 = list1[:]
list3 = deepcopy(list1)
print('修改前:')
print('浅拷贝的list2', list2)
print('深拷贝的list3', list3)

print('修改后:')
list1.append(100)
print('浅拷贝的list2', list2)
print('深拷贝的list3', list3)

print('------------------------------------------华丽的分割线------------------------------------------------')
list1 = [10, [100, 200], 20, 30]
list2 = copy(list1)
list3 = deepcopy(list1)
print('修改前:')
print('浅拷贝的list2', list2)
print('深拷贝的list3', list3)

list1.append(100)
print('修改方式1后:', list1)
print('浅拷贝的list2', list2)
print('深拷贝的list3', list3)


list1[1].append(50)
print('修改方式2后:', list1)
print('浅拷贝的list2', list2)
print('深拷贝的list3', list3)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值