文章的内容是根据[小甲鱼]《零基础入门学习Python》最新版整合的一些内容,感兴趣的可以去看一看
KISS:Keep It Simple & Stupid(简洁胜于复杂)
列表序列
>>>a = [1,2,3,4,5]
>>>a[0]
# 结果为1
>>>a[4]
# 结果为5
# 那么如果一个列表很长的话,我们想输入最后一个元素怎么做呢
>>>a[-1]
# 结果也为5
因为在Python中,对于第一个元素开始从左往右的下标可以为0,1,2······,最后一个元素;而如果列表中元素特别的多时,可以反过来从最后一个元素开始左右往左的下标为-1,-2,-3······;
一、列表切片
对于Python而言,列表切片可以轻松的实现想要获取的列表范围;
例如:
>>>a = [1,2,3,4,5,6,7]
>>>a[0:3] # a[0]到a[3],即a[0],a[1],a[2]前三位
# 1,2,3
>>>a[3:7] # a[3]到a[7],即a[3],a[4],a[5],a[6]后四位
# 4,5,6,7
>>>a[:3] # 即从a[0]开始到a[3]
# 1,2,3
>>>a[3:] # 即a[3]开始到最后一个元素
# 4,5,6,7
>>>a[:] # 即显示所有元素
# 1,2,3,4,5,6,7
>>>a[::2] # 显示所有元素跨度为2
# 1,3,5,7
>>>a[::-1] # 即从最后一个元素开始倒序
# 7,6,5,4,3,2,1
这里需要注意的是,切片不包括最后一个元素,是左闭右开的
二、列表的诸多方法
1、增
向列表中添加元素
append()
:能够添加一个元素;
extend()
:能在原列表的最后一个元素后面添加多个元素,extend()
方法的参数必须是一个可迭代对象;
>>>heroes = ['钢铁侠','蜘蛛侠']
>>>heroes.append('美队')
>>>heroes
# '钢铁侠','蜘蛛侠','美队'
>>>heroes.extend(['雷神','黑寡妇','绿巨人'])
>>>heroes
# '钢铁侠','蜘蛛侠','美队','雷神','黑寡妇','绿巨人'
列表切片的话也可以同样实现上述两种方法:
>>>a = [1,2,3,4,5]
>>>a[len(a):] = [6]
>>>a
# [1,2,3,4,5,6]
>>>a[len(a):] = [7,8,9]
>>>a
# [1,2,3,4,5,6,7,8,9]
insert()
能够实现任意位置的插入;
>>>a = [1,2,3,4]
>>>a.insert(0,0) # 永远是在开头插入,第一个参数是插入的下标位置,第二个是插入的数据;
>>>a
# [0,1,2,3,4]
>>>a.insert(len(a),5) # 永远是在末尾插入;
>>>a
# [0,1,2,3,4,5]
>>>a.insert(1,7)
>>>a
# [0,7,1,2,3,4,5]
2、删
remove()
:删除指定的元素;①如果列表中存在多个匹配的元素,那么只会删除第一个;②如果指定的元素不存在时,那么程序会报错;
pop()
:根据下标索引来删除特定下标位置的元素;
clear()
:删除列表中的所有元素;
>>>a = [1,2,3,3,4,5]
>>>a.remove(3)
>>>a
# [1,2,3,4,5]
>>>a = [1,2,3,4,5]
>>>a.insert(2,7)
>>>a.pop(2)
>>>a
# [1,2,3,4,5]
>>>a.clear()
>>>a
# []
3、改
我们可以直接索引想要修改的内容然后直接替换
>>>原神 = ['芭芭拉','诺艾尔','凝光','可莉']
>>>原神[0] = '琴'
>>>原神
# ['琴', '诺艾尔', '凝光', '可莉']
# 多个连续的替换:
>>>原神[1:] = ['椰羊','罗莎莉亚']
>>>原神
# ['琴', '椰羊','罗莎莉亚']
对于数字的排序问题,在C语言中一般是采用循环的手段来进行排序,而在Python中则有sort()
函数可以直接对数字进行排序:
>>>num = [2,3,4,4,1,2,7,3]
>>>num.sort() # 从小到大数字的排序
>>>num
# [1, 2, 2, 3, 3, 4, 4, 7]
>>>num.reverse() # 对列表的排序翻转
>>>num
# [7, 4, 4, 3, 3, 2, 2, 1]
# 对sort(key=None, reverse=False)而言是有两个入口参数,我们这里暂且不管第一个入口参数,对第二个入口参数而言,当reverse为True时则直接翻转列表
>>>num = [2,3,4,4,1,2,7,3]
>>>num.sort(reverse=True)
>>>num
# [7, 4, 4, 3, 3, 2, 2, 1]
4、查
count()
函数可以查找某个元素在列表中重复的个数;
index()
函数则可以查找某个元素的索引值,如果该元素在列表中不止一个时,index()
只会找到第一个元素;
copy()
函数可以将一个列表的元素复制到另一个列表;
>>>num = [3,5,7,8,3,4,5,2,1,3]
>>>num.count(3)
# 3
>>>num.index(3) # index(x,start,end) x为要查找的元素,start和end表示要查找的范围,如果省略则默认全列表范围;
# 0
>>>num.index(3,1,len(num))
# 4
>>>num_copy1 = num.copy()
>>>num_copy1
# [3, 5, 7, 8, 3, 4, 5, 2, 1, 3]
# 同样我们也可以采用切片的方法来拷贝列表中的元素
>>>num_copy2 = num[:]
>>>num_copy2
# [3, 5, 7, 8, 3, 4, 5, 2, 1, 3]
三、嵌套列表
1、嵌套列表的创建
>>>matrix = [[1,2,3], # 即是矩阵或二维列表
[4,5,6],
[7,8,9]]
>>>matrix
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 这里我们可以使用循环来创建二维列表
>>>A = [0] * 3 # 创建一个一维列表[0, 0, 0]
>>>for i in range(3):
A[i] = [0] * 3 # 这里的话是分别将A[0],A[1],A[2]的元素都替换成了一维列表[0, 0, 0]
>>>A
# [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
这里需要注意的是有一种错误的写法
与上式相同我们先创造一个二维列表:
>>>B = [[0] * 3] * 3
#这种方法同样可以创造出一个二维列表[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
#但是如果对列表的元素进行替换时就会发现错误
>>>A[1][1] = 1
#结果为:
# [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
>>>B[1][1] = 1
# [[0, 1, 0], [0, 1, 0], [0, 1, 0]]
# 其实这里的B拷贝的只是对B的引用
对于上述的错误,我们可以引入is
运算符(也称为同一性运算符),用来检验两个对象是否指向同一个对象(is
与==
的区别是is
比较的是对象的id,而==
比较的是对象的值);
>>>x = 'nice'
>>>y = 'nice'
>>>x is y
True
>>>x = [1,2,3]
>>>y = [1,2,3]
>>>x is y # 对于两个列表而言,即使内容是一样的,但是列表的值是不确定的,所以Python还是为x与y列表分别开辟两个位置;
False
# 所以我们这里可以测试一下上述代码中的列表
>>>A[0] is A[1]
False
>>>A[1] is A[2]
False
>>>B[0] is B[1]
True
>>>B[1] is B[2]
True
# 从这里我们也可以看出B并没有对一维列表[0,0,0]中的B[0],B[1],B[2]重新赋值为一维列表[0,0,0],而是重复的引用同一个一维列表
2、嵌套列表的访问
>>>matrix = [[1,2,3],
[4,5,6],
[7,8,9]]
>>>for i in matrix: # 通过循环就可以把列表中的元素提取出来
for each in i: # 可以理解为matrix代表着第一层列表的个数,而each代表第二层列表的个数(或者理解为先取出矩阵的横向列表,然后打印输出这个横向列表中的每个元素)
print(each,end=' ')
print()
# 结果为:
#1 2 3
#4 5 6
#7 8 9
>>>matrix[0] # 从这里也可以很好的解释上式代码中的两个循环的嵌套
# [1,2,3]
>>>matrix[0][0] # 即二维数组
# 1
四、列表的拷贝
对于列表而言,列表的赋值并不是将列表的数据赋值给变量,而是进行了引用;
即:
>>>x = [1,2,3]
>>>y = x
>>>x[1] = 0
>>>x
# [1,0,3]
>>>y
# [1,0,3]
# 这里相当于x和y都指向列表[1,2,3]
# 所以当x改变时,y也会改变
所以对于列表元素的赋值应该采用的是
copy()
;而对于拷贝而言又区分为深拷贝和浅拷贝
即:
>>>x = [1,2,3]
>>>y = x.copy() # 方法一:采用拷贝的方法来
>>>x[1] = 0
>>>x
# [1,0,3]
>>>y
# [1,2,3]
>>>x = [1,2,3]
>>>y = x[:] # 方法二:或者是采用列表切片的方法来拷贝
>>>x[1] = 0
>>>x
# [1,0,3]
>>>y
# [1,2,3]
>>>import copy
>>>x = [1,2,3]
>>>y = copy.copy(x) # 方法三:引入copy模块,然后调用其中的copy()函数
>>>x[1] = 0
>>>x
# [1,0,3]
>>>y
# [1,2,3]
#以上三种方法都算浅拷贝,在嵌套列表中使用会出现问题
#即:
>>>x = [[1,2,3],
[4,5,6],
[7,8,9]]
>>>y = x.copy()
>>>x[1][1] = 0
>>>x
# [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>>y
# [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
# 这是由于浅拷贝只拷贝了外层对象,如果包含嵌套对象的话只是拷贝了其引用;
# 深拷贝
>>>import copy
>>>x = [[1,2,3],
[4,5,6],
[7,8,9]]
>>>y = copy.deepcopy(x)
>>>x[1][1] = 0
>>>x
# [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>>y
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 虽然能够包含了所有情况列表的拷贝列表,但是Python还是默认使用浅拷贝来拷贝列表,是因为浅拷贝一般情况下效率比深拷贝效率高;
五、列表推导式
从执行效率来说,列表推导式的效率通常要比循环语句快一倍,因为列表推导式在Python中是以更快的C语言的速度来运行的;
# 格式为:[expression for targe in iterable]
# 例如:
>>>x = [1,2,3]
>>>y = [i * 2 for i in x] # i*2:通过从for循环获得的i值后进入表达式i*2,然后在将i*2的结果存入y中
>>>y
# [2,4,6]
>>>matrix = [[1,2,3],
[4,5,6],
[7,8,9]]
>>>diag = [matrix[i][i] for i in range(len(materix))] # 提取出对角线的三个值
>>>diag
# [1,5,9]
而列表推导式也可以很轻松的创建一个二维列表
>>>s = [[0] * 3 for i in range(3)]
列表推导式更高阶一点的可以在里面添加if
分句
[expression for target in iterable if condition]
如下例子
>>>even = [i + 1 for i in range(10) if i % 2 == 0] # 执行顺序是先执行for语句,再执行if语句,最后执行表达式;
>>>even
# [1,3,5,7,9]
>>>words = ['Great','Fish','Excellent','Fantastic']
>>>findF_words = [w for w in words if w[0] == 'F'] # 从中找到首字母是'F'开头的单词
>>>findF_words
# ['Fish', 'Fantastic']
我们还可以嵌套列表推导式:
# 嵌套列表推导式
[expression for target1 in iterable1
for target2 in iterable2
...
for targetN in iterableN]
# 完整的列表推导式语法
[expression for target1 in iterable1 if condition1
for target2 in iterable2 if condition2
...
for targetN in iterableN if conditionN]
>>>matrix = [[1,2,3],
[4,5,6],
[7,8,9]]
>>>flatten = [col for row in matrix for col in row]
>>>flatten
# [1,2,3,4,5,6,7,8,9]
# 上式即嵌套的列表推导式,而我们也可以用for语句来写:
>>>matrix = [[1,2,3],
[4,5,6],
[7,8,9]]
>>>for row in matrix: # 外层的for循环相当于列表推导式前面的for循环,内层的for循环相当于后面的for循环
for col in row:
flatten.append(col)
>>>flatren
# [1,2,3,4,5,6,7,8,9]
>>>[x + y for x in 'miing' for y in 'MIING']
# ['mM', 'mI', 'mI', 'mN', 'mG', 'iM', 'iI', 'iI', 'iN', 'iG', 'iM', 'iI', 'iI', 'iN', 'iG', 'nM', 'nI', 'nI', 'nN', 'nG', 'gM', 'gI', 'gI', 'gN', 'gG'] 也叫笛卡尔乘积
# 完整的列表推导式语法
# 例子:
>>>[[x, y] for x in range(10) if x % 2 == 0 for y in range(10) if y % 3 == 0]
# [[0, 0], [0, 3], [0, 6], [0, 9], [2, 0], [2, 3], [2, 6], [2, 9], [4, 0], [4, 3], [4, 6], [4, 9], [6, 0], [6, 3], [6, 6], [6, 9], [8, 0], [8, 3], [8, 6], [8, 9]]
六、与元组的差别
- 元组的创建使用的是
()
或者是不加圆括号(但有些情况要加入圆括号,所以建议使用时加上); - 元组也可以通过下标来索引元素,但是元组的元素是不可变的;
- 元组也可以使用切片操作;
- 由于元组无法修改,所以就没有列表中的
增删改
,只余下了查
;