python之序列结构 列表(四)

我们前面已经复习过了基本对象,但是对于一些对象组合成的一些基本知识还没有复习过,学习是一个循序渐进的过程,我们就要慢慢理解其中的奥妙


在此之前我们先来了解一下其分类
在这里插入图片描述

列表

包含若干元素的有序连续内存空间。当列表增加或删除元素时,列表对象自动进行内存的扩展或收缩,从而保证相邻元素之间没有缝隙
使用整数作为下标来访问其中的元素
列表对象常用方法

方法 说明
append(x) 将x追加到尾部
extend(L) 将列表L中所有元素追加至列表尾部
insert(index, x) index位置处插入x,该位置后的元素后移并且索引加一
remove(x) 在列表中国删除第一个值为x的元素,该元素之后所有元素前移并且索引减一
pop([index]) 删除并返回列表中下标为index的元素,若不指定index,则默认为-1,弹出最后一个元素
clear() 清空列表,删除列表中的所有元素,保留列表对象
index(x) 返回列表中第一个值为x的元素索引,若不存在则抛出异常
count(x) 返回x在列表中的出现次数
reverse() 对列表中的元素进行原地逆序,首尾交换
sort(key =None, reverse= False) 对列表中的元素进行原地排序,key用来指定排序规则,reverse为False表示升序,True表示降序
copy() 返回列表的浅复制

在看完这个表,我们就能知道一些的基本用法,而一些例子啥的我们都可以在网上找到,这里就不细说了,毕竟列表的内容太多

列表对象支持的运算符
  • 加法运算符
    实现列表增加元素的目的
    e.g.
x = [1,2,3]
x += [4] #连接两个列表
#输出[1,2,3,4]
id[x] #输出内存地址
  • 乘法运算符
    列表和整数相乘,表示序列重复,返回新列表
    e.g.
x = [1,2,3,4]
x = x*2 #元素重复,返回新列表
#输出[1,2,3,4,1,2,3,4]

[1,2,3]*0
#输出[],重复0次,清空
  • 成员测试运算符in
    测试列表中是否包含某个元素,查询时间随着列表长度的增加而线性增加
    e.g.
3 in [1,2,3]
#输出True 

3 in [1,2,'3']
#输出False
内置函数对列表的操作

我们举一些例子就能更好的说明一下了

x = list(range(11)) #生成列表
import random
random.shuffle(x) #打乱列表中的顺序
#输出x为[0,6,10,9,8,7,4,5,2,1,3]

all(x)
#测试所有元素是否都等价于True,输出False
any(x)
#测试是否存在等价于True的元素,输出True
max(x)
#输出10,最大值
max(x,key=str)
#指定的规则返回最大值,9
min(x)
#输出0
sum(x)
#所有元素之和,输出55
len(x)
#列表元素个数,11
list(zip(x,[1]*11))
#多列表元素重新组合
#输出为[(0,1),(6,1),(10,1),,,(x,1),,,(3,1)]

list(zip(range(1,4)))
#用于一个序列或迭代对象
#输出[(1,),(2,),(3,)]
list(zip(['a','b','c'],[1,2]))
#如果两个列表不等长,以短的为主
#[('a',1),('b',2)]
使用列表模拟向量
from random import randint
x = [randint(1,100) for i in range(10)]
#生成10个[1,100]区间内的随机数
list(map(lambda i: i+5,x)) #所有元素同时加5

#列表推导式实现同样的功能
[i+5 for i in x]
列表推导式语法及应用案例

列表推导式,即列表解析式,可以使用非常简洁的方式对列表或其它迭代对象的元素进行遍历,过滤或再次计算,快速生成满足特定需求的新列表
.e.g.

aList = []
for x in range(10):
	aList.append(x*x)

或者可以这样

aList = [x*x for x in range(10)]
aList = list(map(lambda x: x*x, range(10)))
aList = list(map(lambda x: pow(x,2),range(10)))

再如果我们期望实现嵌套列表的平铺
e.g.

vec = [[1,2,3], [4,5,6], [7,8,9]]
[num for elem in vec for num in elem]
#输出[1,2,3,4,5,6,7,8,9]

或者可以等价于

vec = [[1,2,3], [4,5,6], [7,8,9]]
result = []
for elem in vec:
	for num in elem:
		result.append(num)
#可输出为[1,2,3,4,5,6,7,8,9]

又或者
调用标准库中的itertools中的chain()函数,可将子列表串成一个列表

vec= [[1,2,3], [4,5,6], [7,8,9]]
from itertools import chain
list(chain(*vec))
#输出为[1,2,3,4,5,6,7,8,9]

过滤不符合条件的元素
e.g.

aList = [-1,-4,6,7,5,-2.3,9,-11]
[i for i in aList if i>0]
#所有大于0的数字
#输出为[6,7.5,9]
from random import randint
x = [randint(1,10) for i in range(20)]
输出为[10,2,3,4,10,9,2....5,6]

[index for index, value in enumerate(x) if value==m]
#输出最大整数的所有出现位置

同时遍历多个列表或可迭代对象
e.g.

[(x,y) for x in [1,2,3] for y in [3,1,4] if x != y]
#输出为[(1,3),(1,4),(2,3),(2,1),(2,4),(3,1),(3,4)]

[(x,y) for x in [1,2,3] if x ==1 for y in [3,1,4] if y != x]
#输出为[(1,3), (1,4)]

也可等价如下

result = []
for x in [1,2,3]:
	for y in [3,1,4]:
		if x != y:
			result.append((x,y))

列表推导式实现矩阵转置

matrix = [[1,2,3,4], [5,6,7,8],[9,10,11,12]]
[[row[i] for row in matrix] for i in range(4)]
#可输出为[[1,5,9],[2,6,10],[3,7,11],[4,8,12]]

等价为

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])
#输出同样结果
list(map(list, zip(*matrix)))
matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
result = []
for i in range(len(matrix[0])):
	temp = []
	for row in matrix:
		temp.append(row[i])
	result.append(temp)
切片的强大功能

截取列表中的任意部分得到一个新列表,也可修改和删除列表中的部分元素,或作为列表对象增加元素
形式为
[start: end: step]
其中start默认为0,end表示切片截止的位置,step表步长,默认为1,而若step为负整数时,表反向切片,start应该在end右侧
e.g.
利用切片获取列表部分元素

aList = [3,4,5,6,7,9,11,13,15,17]
aList = [::] #返回包含原列表中的所有元素的新列表

aList[::-1] #返回包含原列表中的所有元素的逆序列表

aList[::2] #隔一个取一个,获取偶数元素位置的元素

aList[1::2] #隔一个取一个,获取奇数元素位置的元素

aList[3:6] #指定开始和结束位置

aList[100] #异常,不允许越界访问

aList[100:] #切片开始位置大于列表长度,返回空列表

aList[-15:3] #做必要截断处理,输出[3,4,5]

aList[3: -10: -1] #输出[6,5,4]

使用切片为列表增加元素
可再任意位置插入新元素,不影响列表对象的内存地址,属于原地操作

aList = [3,5,7]
aList[len(aList):]
#输出[]
aList[len(aList):] = [9]
#在列表尾部增加元素
aList[:0] = [1,2] #在列表头部插入多个元素
aList[3:3] = [4] #在列表中间位置插入元素
aList输出
#[1,2,3,4,5,7,9]

使用切片替换和修改列表中的元素

aList = [3,5,7,9]
aList[:3] = [1,2,3] #替换列表中的元素,等号两边的列表长度一致
#输出为[1,2,3,9]

aList[3:] = [4,,5,6] #切片连续,等号两边的长度可不一致
#输出[1,2,3,4,5,6]

aList[::2] = [0]*3 #隔一个修改一个
#[0,2,0,4,0,6]

切片删除列表中的元素

aList = [3,5,7,9]
aList[:3] = [] #删除列表中前三个元素

也可使用del命令,并且可以不连续

aList = [3,5,7,9,11]
del aList[:3] #切片元素连续
#输出为[9,11]

aList = [3,5,7,9,11]
del aList[::2] #隔一个删一个
#输出为[5,9]

切片得到列表的浅复制

aList = [3,5,7]
bList = aList[::]
aList = bList #输出True,两个列表值相等
aList is bList #输出False,不是同一对象

修改bList的值不会影响aList

发布了78 篇原创文章 · 获赞 181 · 访问量 8697

猜你喜欢

转载自blog.csdn.net/qq_44790423/article/details/100601598