python列表操作--浅拷贝深拷贝

列表的in / not in运算符

in 判断一个对象是否在容器中,如果存在返回true,否则返回false

用法同字符串 in 相同

语法:

数据对象 in 容器

示例:

l=[1,“34”,10,23,“富商大贾”]

1 in l True

“34” not in l False

10 in l True

23 in l True

4 not in l True

浮点数最好不要用于比较 存在一个精度问题

浮点数比较大小 可以比较两个数的精度相差的很小

列表的索引

语法:

列表[整数表达式]

用法:

取值时等同于字符串的索引操作

索引分为正向索引和反向索引,规则与字符串索引规则完全相同

列表的索引赋值

列表是可变的序列可以通过索引赋值改变列表中的元素

示例:

l=[1,2,3,4]

l[2]=3.3 将第三个元素改成3.3

列表的切片

语法:

列表[:]

列表[::]

列表的切片取值时,返回一个列表,规则等同于字符串切片规则

列表的切片赋值:

作用:

可以改变元列表排列顺序,可以插入和修改数据

可以用切片改变列表的对应元素的值

语法:

列表[切片]=可迭代对象

ps:赋值运算符的右侧必须是一个可迭代对象

示例:

,>>>l= [12, 45, 2, 3, 3, 4] -------改变的是列表本身,而不是绑定关系
,>>> l[0]
,>>> 12
,>>> l[1:]=[12,34,56,23,12]
,>>> l
,>>> [12, 12, 34, 56, 23, 12]
,>>> l[:]=[11,22,34,55,66]
,>>> l
,>>> [11, 22, 34, 55, 66]
,>>> l=[1,2]
,>>> l[1:1]=[3] ---------实现中间插入[3]
,>>> l
,>>> [1, 3, 2]

,>>> l=[1,2,3]
,>>> l[0:0]=[6,7,8]
,>>> l
,>>> [6, 7, 8, 1, 2, 3]

,>>> l=[1,4]
,>>> l[1:1]=range(2,4)
,>>> l
,>>> [1, 2, 3, 4]

,>>> l=[2,3,4]
,>>> l[1:2]=“asd”
,>>> l
,>>> [2, ‘a’, ‘s’, ‘d’, 4]

切片赋值的注意事项

对于步长不等于1的切片赋值,赋值运算符右侧的可迭代对象提供的元素个数一定要等于切片切出的段数

例:

l=[1,2,3,4,5,6]

l[::2]=“asd” 对的

#以下切出三段,但给出5个元素填充是错的

l[::2]=“asdfg”

a=“hello”
a+=“world”

a
‘helloworld’ -----------------改变的是a的绑定关系而不是a,原来的字符串并没有变化!!!!

删-del语句

用于删除列表中的元素

语法

​ del 序列[整数表达式]

​ del 序列[切片]

示例:

l=[1,2,3,4,5,6]

del l [-1] 删除最后 一个

del l [0] 删除第一个

del l [0:0:2] 删除1,3,5

python中常用语序列的函数:

len(seq) 返回容器的元素个数

max(x) 返回序列的最大值元素

min(x) 返回序列的最小值元素

sum(x) 返回序列中所有元素的和(元素必须是数值类型)

any(x) 真值测试,如果容器内其中一个值为True则返回True,否则返回False

all(x) 真值测试,容器内所有元素的布尔值为True才返回True

Python中常用的列表方法

.index 返回元素对应的索引

.insert (index,obj) 将某个元素插入到列表里的相应的索引处

.append(x) 在列表末尾追加一个元素

.count(x) 返回列表中相同元素的个数

.remove(x) 从列表中删除第一次出现的元素

.extend(list) 在列表末尾追加一个列表,不是列表的嵌套

.append(list) 此时才是列表的嵌套

.sort() 把原来的列表从小到大排序

.sort(reverse) 把原来的列表从大到小排列,默认reverse=false

.reverse() 列表反i转

.pop(index) 删除某个元素,通过索引删 。不给索引,删除最后一个

,>>>L=[2,3,5,7]

,>>>L2=L -------------------这里是赋值

,>>>L2.remove(5)

,>>>L2

,>>>[2,3,7]

,>>>L

,>>>[2,3,7]

,>>>L=[2,3,5,7]

,>>>L2=L[:] --------------------这里是切片,跟复制一样

,>>>L2.remove(5)

,>>>L2

,>>>[2,3,7]

,>>>L1

,>>>[2,3,7]

,>>> l=[12,34,5]

,>>> l.extend([5,6,7])
,>>> l
,>>> [12, 34, 5, 5, 6, 7]
,>>> l.append([12,45,67])
,>>> l
,>>> [12, 34, 5, 5, 6, 7, [12, 45, 67]]

练习:

写一个程序,让用户输入很多个整数,当输入小于0的数是结束输入

1)输出这些数的和 sum

2)输出这些数的最大的数和第二大的数 max l.remove

3)删除最小的数

4)按照原来的输入顺序打印出剩余的数

浅拷贝和深拷贝

deep copy

浅拷贝 shallow copy

是指在复制过程当中,只会复制一层变量,不会复制深层变量

示例:

L=[3.1,3.2]

L1=[1,2,L]

L2=L1.copy() 浅拷贝

L[0]=3.14

L1 =[1,2,[3.14,3.2]]

L2=[1,2,[3.14,3.2]]

L1[2] 和 L2[2] 共同拥有L绑定的对象

python中的变量不存储任何数据,只是一种绑定关系,不占用内存,运行快,效率高

在浅拷贝的过程中,只复制一层,只拷贝了列表中的对象,但是对象绑定的还是原始变量(并没有改变对象的绑定关系)

深拷贝:

示例:

import copy

L[3.1,3.2]

L1=[1,2,L]

L2=copy.deepcopy(L1) 深拷贝 递归地拷贝

L[0]=3.14

L1 =[1,2,[3.14,3.2]]

L2=[1,2,[3.1,3.2]] 此列表不受影响

注意事项:

深拷贝通常只对可变对象进行深层复制,不可变对象通常不会被复制

Python中的对象不可变

理解:

L1=[1,2,[3.1,3.2]]

L2=L1

L3=L1.copy() 用id()函数验证 地址相同

L4=L1.copy.deedcopy(L1)

问题:

如何把L1里的3.1改成3.14

L1[2][0]=3.14

列表和字符串比较
  1. 列表和字符串都是序列,元素之间有先后关系
  2. 字符串是不可变的序列,列表式可变的序列
  3. 字符串中每个元素只能存储字符,二列表可以存储任意类型的元素
  4. 列表和字符串都是可迭代对象
字符串文本解析方法

split和join

S.split(sep=None)

将字符串使用sep作为分隔符分割S字符串,返回分割后的字符串列表,当不给定参数时,用空白字符串作为分隔符分割

S.join(iterable)用可迭代对象中的字符串,返回一个中间用S进行分割的字符串

示例:

s=“Beijing is capital”

L=s.spilt(“ “)

L=[“Beijing”,“is”,“capital”] -------------在有空格处分割

L=[“C:”,“Programe files”,“python3”]

s= ‘ \ \ ’ .join(L)

#s=“C\Programe files\python3”

练习:

有字符串“hello”,生成“h e l l o”和“h-e-l-l-o” 用交互模式完成

列表推导式

list comprehension

列表推导式是用可迭代对象一次生成带有多个元素列表的表达式

作用:

用简易方法生成列表

语法:

[表达式 for 变量 in 可迭代对象]

[表达式 for 变量 in 可迭代对象 if 真值表达式 ]

问题

如何生成[1,4,9,16.。。81]?

L=[]

for x in range(1,10)

L.append(x**2)

用列表推导式生成:

L=[x**2 for x in range(1,10)]

练习

用列表推导式生成1-100内 奇数列表

L=[x for x in range(1,100,2)]

示例:

生成[1,9,25,49,81]列表,跳过所有偶数

[x**2 for x in range(1,10) if x%2==1]

练习

输入一个数值作为开始数 用begin绑定

再输入一个结束的整数用end绑定

将开始至结束的数中,n的平方+1,能被5整除的数放入列表中

请输入开始数:1

请输入结束数:20

n如果(n**2+1)%5==0则把n加入列表中

结果:

[2,3,7,8,12,13。。。]

begin=int(input(“请输入开始数:”))

end=int(input(“请输入结束数:”))

[n for n in range(begin,end+1) if (n**2+1)%5==0]

[2, 3, 7, 8, 12, 13, 17, 18]

列表推导式的嵌套

语法:

[表达式1

​ for 变量 1 in可迭代对象1 if 真值表达式1

​ for 变量2 in可迭代对象2 if 真值表达式2]

示例:

想生成[“A1”,“A2”,“A3”,“B1”,“B2”,“B3”,“C1”,“C2”,“C3”]

[x+y for x in “ABC” for y in “123”] --------------字符串也是可迭代的!

练习

1.输入一个整数n 代表结束的数,将1-n之间所有的素数计算出来,并存入到列表

素数是指除了1和它本身以外不被其他正整数整除

1)最后打印此列表中的全部素数

2)打印这些素数的和

l=[]
sum=0
i=int(input("请输入结束数:"))
for x in range(1,i+1) :
    b=0
    for n in range(2,x):
        if x%n!=0:
            b+=1
            continue
if b==x-2 or x==1:
    l.append(x)
x+=1
for x in l:
    sum+=x
print(l,sum)

2.求100以内有哪些整数与自身加 1的乘积在11求余的结果等于8

​ 打印这些数

​ 将这些数存于列表当中(尝试使用列表推导式)

,>>>[x for x in range(1,101) if x*(x+1)%11==8]

,>>>[5, 16, 27, 38, 49, 60, 71, 82, 93]

3.计算20个斐波那契数,存于列表中,打印这20数

​ 1,1,2,3,5,8,13。。

从第三个数起,后一个数是前两个数之和

l=[1,1]
a=1
while a>=1:
    a+=1
    if a==l[-1]+l[-2]:
        l.append(a)
    if len(l)==20:
        break
print(l)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值