内置函数对列表的操作
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)))