python——序列:列表(3)

1 列表基本用法
列表初始化[],list()内置函数
x=[1,2,3]
y=list(可迭代对象)
添加:insert,append,extend
删除:del,pop,remove
获取:列表对象[索引],index,
排序:列表对象的sort,sorted内置函数
反转:列表对象的reverse,reversed内置函数
获取元素个数:len()内置函数,列表对象的.count()
修改:列表对象[索引]=修改值
      
2 列表对象拷贝
浅拷贝概念:当替换副本中的值时,原件不受影响。 然而,如果修改副本中的引用值,则原数据也受到影响,这种称为“浅拷贝”;
例如:

浅拷贝
x1=[1,2,3]
#浅拷贝
x2=x1.copy()
print(x1 is x2)
x2[1]*=3
print(x1,x2)


例如:深拷贝,导入deepcopy内置方法所在的库

from copy import deepcopy
c1=[1,2,3]
c2=[4,c1,5]
#浅拷贝出对象引用
# c3=c2.copy()
c3=deepcopy(c2)
c3[1][1]*=6
c3[0]*=6

3 列表的推导式
语法:
[表达式 for 变量 in 集合或可迭代的对象]
① 将二维列表转换成一维

x=[[1,2,3],[4,5,6]]
#y=[]
# for i in x:
#     for j in i:
#       y.append(j)
# print(y)
#使用推导式
li=[j for i in x for j in i]

#输出结果:[1, 2, 3, 4, 5, 6]



② 在推导式中过滤数据

#在推导中过滤
xli=[7,4.5,-6,12,-30]
# zli=[]
# for h in xli:
#         if(h>0):
#             zli.append(h)
# print(zli)
#通过推导式 过滤掉负数
yli=[i for i in xli if(i>0)]
print(yli)
#返回过滤对象
# yli=filter(lambda x:x>0,xli)
# print(list(yli))

或者用表达式

zli=filter(lambda x:x>5,li)
print(list(zli))


练习:在一个列表中查询最大元素的位置

import random
xli=[random.randint(10,20) for i in range(10)]
print(xli)
#得到xli的枚举
# e=enumerate(xli)
# #对枚举对象迭代
# for index,data in e:
#     #print(index,data)
#     if(data==max(xli)):
#         print(index)
#列出每个元素对应的索引位置
pli=[pos for pos,v in enumerate(xli) if(v==max(xli))]
print(pli)

③ 模拟zip操作

a=['张靓颖','关晓红','鹿晗']
b=['张飞','关羽','刘备']
#拉链,返回zip对象
# c=zip(a,b)
# print(list(c))
#推导式
c=[(i,j) for ai,i in enumerate(a) for bj,j in enumerate(b) if(ai==bj)]
#x=[(i[1],j[1])for i in enumerate(a)for j in enumerate(b) if (i[0]==j[0])]
#返回结果:[('张靓颖', '张飞'), ('关晓红', '关羽'), ('鹿晗', '刘备')]

④ 推导式实现矩阵的转置

[[1,2,3],
 [4,5,6]
]转置
[[1,4],[2,5],[3,6]]
例如:
#实现矩阵的转置
x=[[1,2,3],[4,5,6]]
for w in range(3):
    for row in x:
        print(row[w],end="\t")
    print()
#推导式转置
# y=[[i[w] for i in x] for w in range(3)]

⑤ 在列表推导式中使用函数
def div(n):
    if(n%2==0):
        return n**2
    else:
        return n+1

v=[1,2,3,4,-1]
vli=[div(i) for i in v if i>0]
#结果:
[2, 4, 4, 16]

另一种推导式
sli=[i**2 if(i%2==0) else i+1 for i in v if i>0]

例:猴子吃桃问题
定义递归函数
def pa(day):
    if(day==10):
        return 1
    else:
        return (pa(day+1)+1)*2
在推导式中调用函数
xli=[pa(n) for n in range(10,0,-1)]

简化后的推导式
from functools import reduce
mli=[reduce(lambda x,y:2*(x+1),range(1,day)) for day in range(2,12)]
或者
mli=[reduce(lambda x,y:2*(x+1),range(1,day)) for day in range(11,1,-1)]

⑥ 使用推导式读取文件内容
#定位文件
ff=open("d:/aa.txt","r",encoding="utf-8")
#使用推导式读取文件内容
fli=[x for x in ff]
print(fli)

⑦ 使用推导式计算素数
mli=[i for i in range(2,100) if(0 not in [i%j for j in range(2,i-1)])]

4 切片
语法:
序列对象[起始索引:结束索引],返回起始索引:结束索引的数据集合
序列对象[起始索引:结束索引:步长],返回起始索引:结束索引没有指定步长的数据集合
4.1 切片获取
li=list(range(10))
print(li)
#获取全部列表
# ali=li[:]
# print(ali)
# #默认步长为1
# bli=li[::]
# print(bli)
#获取指定索引氛围数据
#只指定起始索引,第一个索引位置为0
ali=li[3:]
# print(ali)
#结束位置的索引位置不包含,返回结果[3, 4, 5]
bli=li[3:6]
# print(bli)
#只指定步长为-1,则会倒序输出[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
cli=li[::-1]
# print(cli)
#默认步长为1,获取数据的方向从左到右
cli=li[9:]
# 结果[9]
# print(cli)
#如果步长是1,要求结束位置比起始大,才符合切片原则;否则,返回[]
cli=li[6:3]
cli=li[6:3:-1]
# 结果[6, 5, 4]
cli=li[:-1]
#结果[0, 1, 2, 3, 4, 5, 6, 7, 8]
cli=li[:-3:-2]
#结果[9]
print(cli)

4.2 通过切片修改列表
li=[1,2,3]
# li.append(4)
#在列表上追加可迭代元素
li[100:]=[4,5]
#结果[1, 2, 3, 4, 5]
li[:4]=[6,7,8]
print(li)
#结果[6, 7, 8, 5]
li[-99:1]=[7,8,9]
# 结果:[7, 8, 9, 7, 8, 5]
print(li)
li=[1,2,3]
#插入
li[1:1]=[6,8]
#[1,6,8,2,3]
print(li[1:1])
#删除
li[:]=[]
print(li)
#通过del删除切片
#删除前3个元素
del li[:3]

4.3 切片替换
# a=[1,2,[4,5]]
# #浅拷贝
# b=a[::]
# print(a is b)
# #返回False
# # b[:]=[8,9,10,'J']
# b[2][:]=["春天","王炸","飞机"]
# #[1, 2, ['春天', '王炸', '飞机']]
# print(a)
li=[1,2,3,4]
li[::2]
print(li)
# 结果:[1, 2, 3, 4]
# 注意:当步长不是1,切片的替换列表个数 与所切的数据的个数相同,否则报错
# li[::2]=[5,6]
# 结果:[5, 2, 6, 4]
li[::]=[8,9,10,11,12]
#结果:[8, 9, 10, 11, 12]

5 元组
5.1 元组概念
在python中元组使用一对英文小括号扩住,元素使用英文逗号分隔;元素本身不能改变的;
元组初始化:
注意:有空元组、元组中的元素必须有逗号分隔、内置方法tuple
#初始化方法
x0=()
#空元组<class 'tuple'>
print(type(x0))
x1=(1,2,3)
#<class 'tuple'>
print(type(x1))
x2=(8)
#注意:<class 'int'>返回int类型,元组的元素之间必须有逗号
print(type(x2))
x3=(8,)
#<class 'tuple'>
print(type(x3))
#python中提供内置函数tuple,提供将可序列化的对象转换成元组的方法
li=[8,9,10]
xt=tuple(li)
#(8, 9, 10)
print(xt)
xt2=tuple(range(10))
#输出结果(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
print(xt2)

5.2 元组操作
元组支持使用del删除元组引用对象;
tli=(1,3,5)
#删除元组引用对象
del tli
#报错name 'tli' is not defined
print(tli)

元组支持切片中查询操作;
#li返回range对象
# li=tuple(range(5))
# print(li)
li=(8,[1,2],9)
print(li)
li[1].append(88)
print(li)
#试图修改元素的第二个元素的值,元组中的元素不能修改
li[1]=9
#正确的
li[1][::]=[6,9,7,12]
print(li)

例如:
li=tuple(range(10))
li=(1,3,5)
print(li)
x=[1,2]
y=[4,5,6]

lia=(8,x,9)
#修改
x.extend([88,99])

5.3 

作业:
使用推导式计算水仙花 143=1^3+4^3+3^3 ;

猜你喜欢

转载自blog.csdn.net/weixin_42775190/article/details/82429030