python学习_5——列表list

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WCanGER/article/details/83240840

List列表

问题:
如何将计算机运算的数据临时存入一个地方,同时又方便添加,删除,修改,查看等操作
答案就是使用“容器”啦

列表 list

列表是一种容器
列表是可以被改变的序列容器,可变的数据对象(python中可变数据对象只有四种,后面会一一介绍)

1、列表的创建

1)字面值
创建空列表的字面值

  L = []  # L 绑定一个新创建的空列表

创建非空列表的字面值:

L = [1, 2, 3, 4]
L = ["北京", "上海", "深圳"]
L = [1, "二", 3.14, "Four"]
L = [1, 2, [3.1, 3.2, 3.3], 4]

2)列表的构造(创建)函数 list

list()         	#创建一个空的列表,等同于[]
list(iterable)  #用可迭代对象创建一个列表

示例:

L = list()  		# L绑定空列表
L = list("hello")  	#L绑定['h','e','l','l','o']
L = list(range(10)) # L绑定[0,1,2,3...9]

3)列表推导式 list comprehesion
列表推导式是用可迭代对象创建列表的表达式
作用:
创建列表
语法:
[ 表达式 for 变量 in 可迭代对象]

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

#生成一个数值为1~9的平反的列表
L = [ x**2 for x in range(1,10) ]
# L = [1,4,9,16,...,64,81]
#生成一个1~9中的奇数的平反
L = [ x**2 for x in range(1,10) if x%2 == 1]
#以上的列表推导式可以改写为:
L = []
for x in range(1,10)
	if x%2 == 1:
    	L.append(x**2)

列表推导式的嵌套语法:

[ 表达式
	for 变量1 in 可迭代对象1 if 真值表达式1
		for 变量2 in 可迭代对象2 if 真值表达式2
			...]
示例:
	L = [x+y for x in 'abc' for y in '123']
	#L = ['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3']	

2、列表的操作、运算

1)列表的算术运算
*+ += * =
示例:
+ 加号用于拼接列表

x = [1, 2, 3]
y = [4, 5, 6]
z = x + y  # z = [1, 2, 3, 4, 5, 6]

+= 用于原列表与右侧可迭代对象进行拼接,用变量绑定列表
语法:
x += 可迭代对象
如:

 x = [1, 2, 3]
 y = [4, 5, 6]
 x += y  # x绑定[1, 2, 3, 4, 5, 6]

“ * ” 运算生成重复的列表
“*= ” 运算让原列表重复n次再用原变量绑定

 x = [1, 2] * 3  # x =[1, 2, 1, 2, 1, 2]
 x = [1, 2]
 x *= 2  # x = [1, 2, 1, 2]

2)列表的比较运算:
运算符:
<、 <=、 >、 >=、 ==、 !=
说明:
列表的比较规则与字符串的比较规则相同,只有当前面当前比较的数据相等时,才继续往后比较,否则返回当前结果列表要求每两个元素能依次进行比较,否则会出现类型错误。
当比较元素个数不等时:
如果前面的数都相等,则较长的一个大;如果前面出现不相等的数据,则根据该数据返回结果
结果为两两进行比较,结果为第一个非相等结果(非全等情况)

列表的 in / not in 运算符
判断一个值是否在与列表中,如果存在返回True
否则返回false
同字符串的 in 运算符类似

3)列表的索引操作:
索引取值
语法:

x = 列表[整数表达式]

用法:
等同于字符串索引(可以正向或者反向索引)

索引赋值:
列表时一个可变的序列(容器),可以通过索引赋值改变列表中的元素
语法:

列表[整数表达式] = 表达式

4)列表的切片操作
切片取值

列表[起始索引:终止索引:切片步长]

列表的切片取值是从原列表中去除从起始索引到终止索引按切片步长取出的数据组成的一个新列表
切片的赋值操作(只能对可变序列进行操作)
作用:
可以改变原列表的排列,可以插入和修改数据
语法:

列表[切片] = 可迭代对象(可迭代对象里面的每个元素生成为列表相对位置的一个元素)

说明:
切片赋值的赋值运算符(=)的右侧必须是一个可迭代对象
示例与注意事项:

L = [2,3,4]
L[0:1] = [12,123]

当步长为1时,就把切出来的位置的数据删除插入为后面的可迭代对象的数据
当步长不为1时,插入的可迭代对象的元素数必须为切出来的数据的段数/个数,然后每个位置插入一个数据
L[1:1] = [可迭代DATA]可以实现数据的插入
往后续插入的话,可以使用越界索引,即最后一个索引之后即len(L)
例如:L[len(L):len(L)] = [可迭代data],在列表的最后插入
5)列表的元素删除
del 语句
可以删除列表的元素
语法:

del 列表[整数表达式]
del 列表[切片]

python3中常用于序列的函数:
len(x)返回序列的长度
max(x)返回序列的最大值元素
min(x)返回序列的最小值元素
sum(x)返回序列中所有元素的和(要求序列中的每个元素值必须都为数字类型)
any(x)真值测试,如果序列中有一个值为真值则返回True
all(x) 真值测试,如果序列中的所有元素的值都为真值则返回True
备注:
len(),sum(),any()和all()函数的参数是一个可迭代对象即可
max()与min()的参数可以为一个可迭代对象或者多个数值对象,不可只为一个数值对象
真、假规则:
1、数字如果非0,则为真
2、对象如果非空,则为真
3、None类型为假

3、python3中常用的列表方法(method)

方法 作用
L.index(v [, begin[, end]]) 返回对应元素的索引下标, begin为开始索引,end为结束索引,当 value 不存在时触发ValueError错误
L.insert(index, obj) 将某个元素插放到列表中指定的位置
L.count(x) 返回列表中元素的个数
L.remove(x) 从列表中删除第一次出现在列表中的值
L.copy() 复制此列表(只复制一层,不会复制深层对象)
L.append(x) 向列表中追加单个元素
L.extend(lst) 向列表追加另一个列表,lst为一个可迭代对象
L.clear() 清空列表,等同于 L[:] = []
L.sort(reverse=False) 将列表中的元素进行排序,默认顺序按值的小到大的顺序排列
L.reverse() 列表的反转,用来改变原列表的先后顺序
L.pop([index]) 删除索引对应的元素,如果不加索引,默认删除最后元素,同时返回删除元素的引用关系

深拷贝 deep copy 和浅拷贝 shallow copy
(差别在与两个之间所关联的深层对象是否被复制)
浅拷贝:
L = [1,2,3]
L2 = L ,这个并没有拷贝
L2 = L.copy() 这个是浅拷贝
浅拷贝是指在复制过程中,只复制一层变量,不会复制深层变量绑定对象的复制过程
如:

L= [1,2,3]
L1 = [1,2,L]
L2 = L1.copy() #浅拷贝此时  id(L1[2]) = id(L2[2])且id(L1)!=id(L2)(id(L1[n]) = id(L2[n]) n属于(0~len(L1)-1)

此时的L1与L2中的L都指向同一个内存地址/数据,也就是这里只copy了L绑定的对象的地址,并不是深层的copy了L中的元素
此时修改了L1或者L2中的L,两个L1,L2中的L都会被修改,因为是同一个L

>>>id(L)
1936964996424
>>>id(L1[2])
1936964996424
>>>id(L2[2])
1936964996424

注:只有可变对象需要深拷贝,不可变对象无需深拷贝,因为不会出现拷贝对象深层被修改的情况
深拷贝:
如:

import copy #使用copy模块中的deepcopy函数
L= [1,2,3]
L1 = [1,2,L]
L2 = copy.deepcopy(L1)

此时实现了深拷贝
对深拷贝后的对象任意一个进行修改,不会影响到另一个
深拷贝会耗费更多的时间和内存

4、列表和字符串的比较:

1.列表和字符串均为序列,元素之间有先后顺序关系
2.列表和字符串有相同的操作:+ += * *= < > in / not in 索引 和 切片…
3.字符串是不可变的序列,列表是可变的序列
4.字符串的每个元素只能存储字符,而列表可以存储任意类型的元素
5.列表和字符串都是可迭代对象

猜你喜欢

转载自blog.csdn.net/WCanGER/article/details/83240840