day6-元组和字典

01 列表相关函数和方法

1.列表(序列) 相关函数-- max min sum len sorted reversed

  • max(序列) - 获取最大(序列中的元素本身必须支持比较运算,并且元素之间可以比较大小

    nums=[89, 23, 45, 890, 82, 40]
    print(max(nums))
    
  • min(序列) - 获取最小(序列中的元素本身必须支持比较运算,并且元素之间可以比较大小

    print(min(nums))
    
  • sum(序列) – 求序列中所有元素的和(序列中元素必须是数字)

    print(sum(nums))
    print(sum(range(1, 101)))
    
  • len(序列) - 求序列中元素的个数

    print(len([10,20,'abc',[10,20],range(3)]))
    
  • sorted(序列) - 将序列中元素从小到大排序,返回一个排完序后的新列表

  • sorted(序列,reverse = True) - 将序列中元素从大到小排序,返回一个排完序后的新列表

    new_nums = sorted(nums)
    print(nums, new_nums)
    
    new_nums = sorted(nums,reverse=True)
    print(nums,new_nums)
    
  • reversed(序列) - 将序列中的元素倒序

    new_nums = reversed(nums)
    print(new_nums)   # 返回迭代器 <list_reverseiterator object at 0x0000028C8D9D9E88>
    for x in new_nums:
        print(x)   # 得到元素
    
    
    # 倒序  可用  切片倒序
    print(nums[::-1])
    
    
  • list() - 将其他序列转换成列表 # 所有的序列都可以转换成列表

    print(list('abc'))    # ['a', 'b', 'c']
    print(list(range(1,3)))  # [1, 2]
    
    

2.列表相关方法

    1. 列表.clear() -清空列表
    names = ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记']
    names.clear()
    print(names)   # []
    # names=[]   #也可以清空
    
    
  • 2)列表.copy() - 复制原列表产生一个一模一样的新列表 与赋值不一样

    names = ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记']
    new_names = names.copy()
    print(new_names)
    
    # 直接赋值
    names2 = names
    names.pop()   # names的最后一个元素被删除,new_names不变
    print(names2)   # names2与names一样
    print(names, new_names)
    
    
  • 3)列表.count(元素) - 统计指定元素在列表中出现的次数

    print(names.count('死亡笔记'))  # 1
    print(names.count('死神'))  # 0
    
  • 4)列表.extend(序列) - 将序列中所有的元素添加到列表中

    names = ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记']
    names.extend(['火影忍者','妖精的尾巴','123'])
    print(names)
    # ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记', '火影忍者', '妖精的尾巴', '123']
    
    1. 列表.index(元素) - 返回下标(从0开始)
    names = ['罗小黑战记', '海贼王', '一人之下', '进击的巨人','海贼王','海贼王' ,'死亡笔记']
    print(names.index('一人之下'))   # 2
    names = ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记']
    names.extend(['火影忍者','妖精的尾巴','123'])
    print(names)
    # ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记', '火影忍者', '妖精的尾巴', '123']
    
    print(names.index('火影'))   #不存在->报错
    print(names.index('海贼王'))
    
    1. 列表.reverse() - 将列表倒序(不会产生新的列表)
    names = ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记', '海贼王']
    names.reverse()
    print(names)    # ['海贼王', '死亡笔记', '进击的巨人', '一人之下', '海贼王', '罗小黑战记']
    
    1. 列表.sort() - 将列表元素从小到大排序
    nums = [78, 90, 67, 56, 99]
    new_nums = nums.sort()
    print(nums)    # [56, 67, 78, 90, 99]
    print(new_nums)    # None
    

02列表推导式

列表推导式 - 用来创建列表的表达式

推导式的应用:创建列表、元素筛选、元素的变换

    1. 推导式通用格式1
"""
[表达式 for 变量 in 序列]  

创建列表的原理:
list1 = []
for 变量 in  序列:
    list1.append(表达式)
"""
list1 = [x for x in range(4)]
print(list1)

list2 = [2*x + 3 for x in range(4)]
print(list2)   # [3, 5, 7, 9]

list3 = [x*2 for x in 'abc']
print(list3)


# 练习:已知列表scores = [89, 34, 56, 23, 90, 100],将列表中的成绩转换成十分制的值
# scores = [89, 34, 56, 23, 90, 100] -> [8.9, 3.4, 5.6, 2.3, 9.0, 10.0]
score = [89, 34, 56, 23, 90, 100]
list4 = [x/10 for x in score]  # [8.9, 3.4, 5.6, 2.3, 9.0, 10.0]
print(list4)



  • 2.推导式通用格式2
"""
[表达式 for 变量 in 序列 if 条件语句]

原理:
list1=[]
for 变量 in 序列:
    if 条件语句:
        list1.append(表达式)
        
"""
nums =[23, 89, 34, 56, 23, 90, 100]
new_nums = [x for x in nums if x % 2 == 1]
print(new_nums)


# 练习:删除列表中所有的空值和0值
list1 = [12, 'abc', True, 0, 0.00, 0.02, '', [], [1, 2]]
# -> [12, 'abc', True, 0.02, [1, 2]]
new_list1 = [x for x in list1 if x]
print(new_list1)


  • 3.补充:三目运算符

"""
1) C的三目运算符:
表达式1?表达式2:表达式3 -> 如果表达式1=0  结果为表达式3,否则为表达式2

2)python
变量=表达式2 if 表达式1 else表达式3 ->如果表达式1=0  结果为表达式3,否则为表达式2
"""
#
# age = 17
# if age >=18:
#     result='成年'
# else:
#     result='未成年'
#

age = 27
result = '成年' if age >= 18 else '未成年'

score = [89, 34, 56, 23, 90, 100]
new_score = ['及格' if x >= 60 else '不及格' for x in score]
print(new_score)

03推导式整理

  • 1.整体变换 - 将原序列中的元素通过统一的规则转换成一个新的序列

    # 方案: [表达式 for 变量 in 序列]  -  表达式用来描述新序列中的元素和原序列元素之间的规则
    nums = [23,789,90,67,22,31]
    # [3,9,0,7,2,1]
    result = [x % 10 for x in nums]
    print(result)  # [3, 9, 0, 7, 2, 1]
    
    
  • 2.部分变换(按照两种不同的方式变换)

    # if 在前
    # 方案:[三目运算 for 变量 in 序列]
    list1 = [23, 'abc', 78, '234', 1.23, [10,30]]
    # [230, 'abc', 780, '234', 12.3, [10,30]]  部分*10  仅数字
    
    # new_list1=[x*10 if type(x) == int or type(x) == float else x for x in list1]
    # 两个选择 in []
    new_list1=[x*10 if type(x) in [int,float] else x for x in list1]
    print(new_list1)
    
    
  • 3.筛选、删除

    # if在后
    # 方案:[表达式 for 变量 in 序列 if 条件语句]
    scores = [89, 33, 67, 8, 98, 23, 66, 81]
    result=[x for x in scores if x >= 60]
    print(result)  # [89, 67, 98, 66, 81]
    
    

04元组

  • 1.什么是元组 (tuple)

    """
    元组是容器型数据类型(序列),将()作为容器标志,里面多个元素用逗号隔开(元素1,元素2,...)
    元组是不可变的(不支持增删改)、元组是有序的(支持下标操作)
    任何类型的数据都可以作为元组的元素
    """
    
    • 1)空元组

      t1 = ()
      print(t1, type(t1), len(t1))   # () <class 'tuple'> 0
      
    • 2)只有一个元素的元组:元素后面的逗号不能省

      l1 = [100]
      print(l1, type(l1), len(l1))  # [100] <class 'list'> 1
      
      t2 = (100)
      print(t2, type(t2))   # [100] <class 'list'>
      t3 = (100,)
      print(t3, type(t3))  # (100,) <class 'tuple'>
      
    • 3)普通

      t4 =(10, 12.9, 'abc', 10)
      print(t4, type(t4))  # (10, 12.9, 'abc', 10) <class 'tuple'>
      
  • 2.元组就是不可变的列表 – 列表中凡是和增删改不相关的操作元组都支持

    • 1)查:单个元素,切片,遍历

      t5 = ('肖申克的救赎','阿甘正传','霸王别姬','美丽人生','黑客帝国','触不可及','这个杀手不太冷','V字仇杀队')
      print(t5[1])  # 阿甘正传
      print(t5[-1])  # V字仇杀队
      # print(t5[100])  # 越界报错
      
      # 切片 -- 类型是元组
      print(t5[1:])  # ('阿甘正传', '霸王别姬', '美丽人生', '黑客帝国', '触不可及', '这个杀手不太冷', 'V字仇杀队')
      print(t5[3:0])  # () 空
      print(t5[2:-2:2])  # ('霸王别姬', '黑客帝国')
      
      
      # 遍历
      for x in t5:
          print('x=', x)
      
      for index in range(len(t5)):
          print(index,t5[index])
      
    • 2)+ - * in /not in

      # 加法
      l2 =[1,2,3]
      result = l2+[10,20]
      print(result,l2)  # [1, 2, 3, 10, 20] [1, 2, 3]
      
      t6 =(10,20)
      print(t6 + (100,200))  # (10, 20, 100, 200)
      print(t6 * 3)  # (10, 20, 10, 20, 10, 20)
      
      # in/ not in
      print(1 in t6)  # False
      
    • 3)max min sum sorted reversed len tuple

      scores = (98, 78, 67, 56, 23, 45, 99, 82, 86)
      print(max(scores))  # 99
      print(min(scores))  # 23
      print(sorted(scores))  # 列表 [23, 45, 56, 67, 78, 82, 86, 98, 99]
      print(tuple([10, 230, 4]))  # 转元组  (10, 230, 4)
      
    • 4)相关方法: count、index

      print(scores.count(99))  # 1
      print(scores.index(56))  # 3
      
  • 3.元组不只是不可变列表

    • 1) 元组的()在没有歧义的情况下可以去掉

      t1 = 10,20,30
      print(t1,type(t1))  #(10, 20, 30) <class 'tuple'>
      
      t2 = 10,20,30 *2
      print(t2)  # (10, 20, 60)
      
    • 2) 获取元组元素:让变量个数和元组中元素个数一致

      point1 =(10,98)
      x,y = point1
      print(x,y)  # 10 98
      
      point2 =(-19,89,29)
      x,y,z = point2
      print(x, y, z)  # -19 89 29
      
      # x,y =point2   # ValueError: too many values to unpack (expected 2)
      # z1,y1,z1,t1 = point2  # ValueError: not enough values to unpack (expected 4, got 3)
      
    • 3)获取元组元素:让变量个数小于元组中元素的个数,但是必须在某一个变量前加*

      # 先让不带*的变量按照位置去获取元组中的元素,然后让剩下的元素全部作为一个列表返回给带*的变量
      t2 = (100, 200, 'abc', '男', 'True', 300)
      *x,y,z = t2
      print(y,z)  # True 300   (没有取到的都赋给*)
      print(x)  # [100, 200, 'abc', '男']   列表
      
      x,y,*z = t2
      print(x,y)  # 100 200
      print(z)  # ['abc', '男', 'True', 300]
      
      x,*y,z = t2
      print(x,z)  # 100 300
      print(y)  # [200, 'abc', '男', 'True']
      
      x,*y,z,t =t2
      print(y)  # [200, 'abc', '男']
      

05认识字典

# 定义一个变量保存一个学生的信息
name = '小明'
age = 30
height = 170
name2 = '张三'
age2 = 40

#f2
stu1 = ['小明',18,170,74,80,'男']
print(stu1[0])

# 字典
stu2 = {'姓名':'小明','age':30,'height':170,'weight':74,'score':80,'性别':'男'}
print(stu2['姓名'])

students=[
    {'name':'小明','age':30,'tel':'566245'},
    {'name':'小明','age':30,'tel':'566245'},
    {'name':'小明','age':30,'tel':'566245'}

]

c1 ={
    'name':'小明',
    'age':30,
    'tel':'566245',
    'teacher':[
        {},
        {},
        {}
    ],
    'students':[
        {},
        {},
        {}
    ]
}

作业

1.创建一个列表,列表中有10个数字, 保证列表中元素的顺序,对列表进行排重,并对列表使用进行降序排序

例如:随机生成了[70, 88, 91, 70, 107, 234, 91, 177, 282, 197]
		--- 去重之后 [70, 88, 91, 107, 234, 177, 282, 197]
  	---- 降序排序 [282, 234, 197, 177, 107, 91, 88, 70]
list1=[70, 88, 91, 70, 107, 234, 91, 177, 282, 197]
new_list1 = []
for x in list1:
    if x not in new_list1:
        new_list1.append(x)
print(new_list1)
new_list1.sort(reverse=True)
print(new_list1)

2.利用列表推导式, 完成以下需求

a. 生成一个存放1-100中个位数为3的数据列表

结果为 [3, 13, 23, 33, 43, 53, 63, 73, 83, 93]
result=[x for x in range(1,100) if x % 10 == 3]
print(result)

b. 利用列表推到是将 列表中的整数提取出来

例如:[True, 17, "hello", "bye", 98, 34, 21] --- [17, 98, 34, 21]
list2 = [True, 17, "hello", "bye", 98, 34, 21]
new_list2=[x for x in list2 if type(x) == int]
print(new_list2)

c.利用列表推导式 存放指定列表中字符串的长度

例如: ["good", "nice", "see you", "bye"] --- [4, 4, 7, 3]
list3 = ["good", "nice", "see you", "bye"]
new_list3=[len(x) for x in list3]
print(new_list3)

d. 利用列表推导式删除列表中整数个位数小于5的元素

例如:[24, 'abc', 99, True, 21, 38, 'hello'] --- ['abc', 99, True, 38, 'hello']
list4 = [24, 'abc', 99, True, 21, 38, 'hello']
print(list4)
new_list4=[x for x in list4 if type(x) != int or x % 10 >= 5]
print(new_list4)

e. 利用列表推导式获取元素是元组的列表中每个元组的最后一个元素

例如:[(10, 20, 30), ('abc', 'hello'), (1, 2, 3.4), (True, False)]  --- [30, 'hello', 3.4, False]
list5 = [(10, 20, 30), ('abc', 'hello'), (1, 2, 3.4), (True, False)]
new_list5=[x[-1] for x in list5]
print(new_list5)

3.已知代码如下,请回答出各个print的结果 并说明原因

nums = [17, 39, 28, 51]
nums2 = nums
nums2.pop()
print(len(nums)) # 这个结果是什么   请描述原因

# 结果为3
"""
nums2 = nums 直接复制操作,nums2,nums指向相同的地址
删除nums2指向列表的最后一个元素,等价于删除nums指向列表的最后一个元素
所以nums列表长度减1
"""


numlist = [17, 22, 39, 58, [55, 43]]
nums3 = numlist.copy()
print(numlist is nums3) # 结果  原因是什么

"""
结果是:False
copy()是产生了新的列表 
nums3指向新列表,numlist指向原列表
两个列表地址并不相同
"""


numlist[-1][0] = 99
print(nums3) # num3会不会发生变化
"""
 num3不会发生变化
 修改的是numlist的值
 而nums3未被修改
"""

4(试一下). 定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )
a.统计不及格学生的个数
b.打印不及格学生的名字和对应的成绩
c.统计未成年学生的个数
d.打印手机尾号是8的学生的名字
e.打印最高分和对应的学生的名字

​ f.删除性别不明的所有学生

​ g.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)

students=[
    {'name':'小明','age':30,'score':90,'tel':'566245','性别':'女'},
    {'name':'小红','age':25,'score':80,'tel':'566245','性别':'男'},
    {'name':'小张','age':20,'score':50,'tel':'566245','性别':'女'},
    {'name':'小赵','age':17,'score':63,'tel':'566245','性别':'未知'},
    {'name':'小李','age':18,'score':70,'tel':'566245','性别':'男'},
    {'name':'小吴','age':19,'score':90,'tel':'566245','性别':'女'},
]

#a.统计不及格学生的个数
count =0
for i in range(len(students)):
    if students[i]['score'] < 60:
        count +=1
print(count)
# 1


# b.打印不及格学生的名字和对应的成绩
for i in range(len(students)):
    if students[i]['score'] < 60:
        print(students[i]['name'],students[i]['score'])
# 小张 50


# c.统计未成年学生的个数
count1=0
for i in range(len(students)):
    if students[i]['age'] < 18:
        count1 += 1
print(count1)
#3


# d.打印手机尾号是8的学生的名字
for i in range(len(students)):
    if int(students[i]['tel']) % 10 == 8:
        print(students[i]['name'])
# 小张
# 小吴  




# e.打印最高分和对应的学生的名字
max1 =0
index1=[]
for i in range(len(students)):
    if students[i]['score'] >= max1:
        max1 = students[i]['score']
        index1.append(i)
#print(index1)
for x in index1:
    print(students[x]['score'],students[x]['name'])
#90 小明
#90 小吴


# f.删除性别不明的所有学生
new_students = []
for i in range(len(students)):
    if students[i]['性别'] != '未知':
        new_students.append(students[i])

print(new_students)
# [{'name': '小明', 'age': 30, 'score': 90, 'tel': '566245', '性别': '女'}, {'name': '小红', 'age': 25, 'score': 80, 'tel': '566247', '性别': '男'}, {'name': '小张', 'age': 20, 'score': 50, 'tel': '566278', '性别': '女'}, {'name': '小李', 'age': 12, 'score': 70, 'tel': '566235', '性别': '男'}, {'name': '小吴', 'age': 15, 'score': 90, 'tel': '566298', '性别': '女'}]


# g.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
new_students2 = []
for i in range(len(students)):
    new_students2.append(students[i]['score'])

#print(new_students2)
new_students2.sort(reverse=True)
print(new_students2)
# [90, 90, 80, 70, 63, 50]
上一篇:set集合遍历方法


下一篇:【Beta】Scrum meeting 3