Python疫起学习·万丈高楼平地起Day05(精简版|浓缩就是精华)列表知识点终结版(附上成绩评测小程序)

内置函数对列表的操作

max()、min()返回列表所有元素最大最小值,sum()求和,len()返回列表元素个数,zip()函数用于将多个列表中元素重新组合为元组并返回这些元组的zip对象,enumerate()返回包含若干下标和值的迭代对象,map()把函数映射到列表上的每个元素,filter()函数根据指定函数返回值对列表元素进行过滤,all()用来测试列表中是否所有元素都等价于True,any()用来测试列表中是否有等价于True的元素。下几期我介绍itertools用法
这里先略微演示一些我刚才提到的部分函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十六、使用列表模拟向量运算

Python列表对象本身并不支持向量运算的,但可以借助内置函数、列表推导式和标准库operator中的方法实现。如需更加丰富和强大的向量或矩阵运算,可以借助于Python扩展库numpy实现
在这里插入图片描述
在这里插入图片描述

十七、列表推导式***

list comprehension列表推导式又称列表解析式,可以以非常简洁的方式对列表或其他可迭代对象的元素进行遍历、过滤或再次计算,快速生成满足特定需求的新列表,可读性强
语法格式:
[expression for expr1 in sequence1 if condition1 for expr2 in sequence2 if condition2…for exprN in sequenceN if conditionN]

alist = [x * x for x in range(10)]

相当于

alist = []
for i in range(10):
	alist.append(i * i)

如果不用列表推导式还可以用lambda函数

alist = list(map(lambda x : x * x, range(10)))
alist = list(map(lambda x : pow(x, 2), range(10)))

再例如:

fruit = ['  banana', '   apple   ', 'pear    ', 'strawberry   ']
alist = [w.strip() for w in fruit]

等价于:

fruit = ['  banana', '   apple   ', 'pear    ', 'strawberry   ']
alist = []
for item in fruit:
    alist.append(item.strip())

如果不用列表推导式还可以用lambda函数

alist = list(map(lambda x : x.strip(), fruit))
alist = list(map(str.strip, fruit))

在这里插入图片描述
通过一行代码即可构造出来,通过for循环打印出每个URL
在这里插入图片描述

  • 1)实现嵌套列表平铺
v = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[num for elem in v for num in elem]

这里列表推导式中有两个循环,等价下面的写法:

result = []
for elem in v:
    for num in elem:
        result.append(num)
        
result

在这里插入图片描述
也可以借助标准库itertools中的chain()函数把子列表串起来成为一个列表

from itertools import chain
list(chain(*v))

也可以用递归函数调用,尤其是面对多级嵌套的列表
在这里插入图片描述
这里扩展一下,还可以将一维的转换为r行c列的列表

def resize(lst, r, c = -1):
    if not isinstance(lst, list):
        return 'must be a list'
    for item in lst:
        if not isinstance(item, (int, float, complex)):
            return 'must be a list of numbers'
    if not (isinstance(r, int) and isinstance(c, int)):
        return 'Wrong size.'
    
    originLen = len(lst)
    
    if c == -1:
        if originLen % r != 0:
            return 'Wrong size.'
        c = originLen // r
    else:
        if r * c != originLen:
            return 'Wrong size.'
    result = []
    for i in range(r):
        result.append(lst[i * c : i * c + c])
        
    return result

lst = list(range(20))
result = resize(lst, 4, 5)
if type(result) == list:
    for row in result:
        print(row)
else:
    print(result)

结果如下:
在这里插入图片描述

  • 2)过滤不符合条件的元素
    列表推导式可以使用if子句对列表中的元素进行筛选
    下面代码可以列出当前文件夹下所有Python源文件
import os
print([filename for filename in os.listdir('.') if filename.endswith(('.py','.pyw'))]) 

在这里插入图片描述
在这里插入图片描述
这样就可以从列表中选择符合条件的元素成为新列表
在这里插入图片描述
在这里插入图片描述

  • 3)同时遍历多个列表或可迭代对象
    在这里插入图片描述
    相当于下面的代码
    在这里插入图片描述
    笛卡尔积方法:
    在这里插入图片描述
  • 4)使用列表推导式实现矩阵转置
matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
[[row[i] for row in matrix] for i in range(4)]

具体实现过程等价于下面的代码:

matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
result = []
for i in range(len(matrix[0])):
    result.append([row[i] for row in matrix])
  • 5)列表推导式中可以使用函数或复杂表达式
    在这里插入图片描述
  • 6)列表推导式支持文件对象迭代
with open('D:\\Python3.7.7\\LICENSE.txt', 'r') as fp:
    print([line for line in fp])

在这里插入图片描述

  • 7)使用列表推导式生成100以内的所有素数
import math
[p for p in range(2, 100) if 0 not in [p % d for d in range(2, int(math.sqrt(p)) + 1)]]
十八、切片

[start : end : step]

  • 1)使用切片获取列表部分元素
    在这里插入图片描述
  • 2)使用切片为列表增加元素
    在这里插入图片描述
  • 3)使用切片替换和修改列表中的元素
    在这里插入图片描述
    在这里插入图片描述
  • 4)使用切片删除列表中的元素
    del也可以和切片相结合使用,切片可以不连续
    在这里插入图片描述
  • 5)切片得到的是列表的浅复制或深复制
    i)深复制的情况
    在这里插入图片描述
    在这里插入图片描述
    ii)浅复制情况
    在于列表中包含列表或其他可变序列
    在这里插入图片描述
小案例

成绩评测

scores = []
while True:
    x = input('请输入一个成绩:')
    try:
        scores.append(float(x))
    except:
        print("这是不合法的成绩")
    while True:
        flag = input('继续输入吗?(yes/no)')
        if flag.lower() not in ('yes','no'):
            print('只能输入yes或no')
        else:
            break
    if flag.lower() == 'no':
        break
        
print("平均分为:" + str(sum(scores) / len(scores)))

在这里插入图片描述

如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持,明天我们不见不散!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值