下面实现在Anaconda里面
1. 列表创建
通俗含义:如果你要上街买菜,需要使用到菜篮子,其中菜篮子可以装鸡蛋,蔬菜,肉类,水果。其中菜篮子就是python中所要用到的列表
创建列表:其中列表的下标可以用复数表示。
a = [1,2,3,4,5]
b = [1,2,3,4,5,"上山打老虎"]
rhym = [1,2,3,4,5,"上山打老虎"]
#序列是python里面最常见的数据结构
for each in rhym:
print(each)
#只访问列表的某一个位置的元素
rhym[0] #1
rhym[5] #'上山打老虎'
length = len(rhym)
rhyme[length - 1] #'上山打老虎'
rhym[-1] #'上山打老虎'
元素 | 1 | 2 | 3 | 4 | 5 | ‘上山打老虎’ |
下标 | -6 | -5 | -4 | -3 | -2 | -1 |
1.2 列表切片
切片:可以一次性获取多个元素
ryhm = [1,2,3,4,5,"上山打老虎"]
ryhm[1,4] #2,3,4
ryhm[0:5] #1,2,3,4,5
ryhm[0:6:2] #1,3,5
ryhm[::2] #1,3,5
ryhm[::-2] #['上山打老虎',4,2]
ryhm[::-1] #['上山打老虎',5,4,3,2,1]
2. 列表的诸多方法
有时候可以用切片来实现
2.1 增/删/
append():每次只能添加一个元素
extend():可以直接添加一个迭代对象
insert(a,b) :在a的位置插入元素 b
remove() :删除一个元素,如果里面有多个数据相同,这只会删除一个元素。如果删除不存在的元素则会报错。
pop(i) :指定下标去删除一个元素
clear() :清空列表的数据
heros = ["钢铁侠","绿巨人"]
heros.append("黑寡妇")
heros #["钢铁侠","绿巨人","黑寡妇"]
heros.extend(["鹰眼","灭霸","雷神"])
#["钢铁侠","绿巨人","黑寡妇","鹰眼","灭霸","雷神"]
s = [1,2,3,4,5]
s[len(s):] = [6] #[1,2,3,4,5,6]
s[len(s):] = [7,8,9] #[1,2,3,4,5,6,7,8,9]
a = [1,3,4,5]
a.insert(1,2) #[1,2,3,4,5]
a.insert(len(s),6) #[1,2,3,4,5,6]
heros.remove("灭霸") #["钢铁侠","绿巨人","黑寡妇","鹰眼","雷神"]
heros.pop(2) #["钢铁侠","绿巨人","鹰眼","雷神"]
2.2 改/查
sort() :可以进行排序 s.sort(key=None,reverse=False) 对列表的元素进行原地排序,(key参数用于指定一个用于比较的函数; reverse 参数用于指定排列结果是否反转)
reverse() :将列表的元素全部倒过来
count(a) : 查找元素有多少个个数
index(i) : 查找元素i的下标
index(i,a,b) :查找元素i ,从下标a开始,到下标b结束。
copy() :拷贝元素
heros = ["钢铁侠","绿巨人","黑寡妇","鹰眼","灭霸","雷神"]
heros[3:]=["武松","林冲","李逵"]
#["钢铁侠","绿巨人","黑寡妇","武松","林冲","李逵"]
numbers = [1,3,7,8,6,1,4,1,5,7,2]
numbers.sort() #[1,1,1,2,3,3,4,5,6,7,7,8]
numbers.reverse() #[8,7,7,6,5,4,3,3,2,1,1,1]
numbers.sort(reverse=True) #[8,7,7,6,5,4,3,3,2,1,1,1]
heros.index("绿巨人") #4
heros[heros.index("绿巨人")] = "神奇女侠"
#["钢铁侠","神奇女侠","黑寡妇","武松","林冲","李逵"]
nums = [1,3,7,8,6,1,4,1,5,7,2]
nums.index(3) #1 会找到第一个元素的下标位置
nums.index(3,1,7) #5
nums_copy1 = nums.copy()
nums_copy1 # [1,2,7,8,6,1,4,1,5,7,2]
nums_copy2 = nums[:]
3. 列表的加法和乘法
要求加号两边都是列表
s = [1,2,3]
t = [4,5,6]
s + t #[1,2,3,4,5,6]
s * 3 #[1,2,3,1,2,3,1,2,3]
matrix = [[1,2,3],[4,5,6],[7,8,9]] #创建一个二位列表
#反问嵌套列表
for i in matrix:
for each in i:
print(each)
# 1,2,3,4,5,6,7,8,9
for i in matrix:
for each in i:
print(each,end='')
print()
#1 2 3
4 5 6
7 8 9
matrix[0]
#[1,2,3]
matrix[0][0] #1
matrix[1][1] #5
A = [0] * 3 # [0,0,0]
for i in range(3):
A[i] = [0] * 3 #[[0,0,0],[0,0,0],[0,0,0]]
3.1 is运算符
python 对于不同对象的存储机制是不一样的,字符串都是不能变的,所以它只需要在内存中开辟一个位置来存放就可以了,如果有多个变量名指向同一个字符串。
比如说我们这里x和y都指向“Fishc”,那么他们的关系就是 x ☞ "Fishc", y ☞ "Fishc"
A = [0] * 3 #[0,0,0]
for i in range(3):
A[i] = [0] *3 #[[0,0,0][0,0,0][0,0,0]]
#特殊情况-----------------------------------------
#如果B 的取值如下:
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]]
X = "Fishc"
y = "Fishc"
x is y #True
x = [1,2,3]
y = [1,2,3]
x is y #False
3.2 变量
将一个变量的值传给另外一个变量,我们称之为引用。
如果想获得两个独立的列表,只能通过拷贝。
x = [1,2,3]
y = x #此时y也指向x
x[1] = 1
x #[1,1,3]
y #[1,1,3] #如果该掉变量x 则y 也会跟着改变。
3.3 浅拷贝和深拷贝
深拷贝会360°无死角的全方位拷贝。但是浅拷贝的效率会比较好,所以会默认使用浅拷贝。
#浅拷贝
x = [1,2,3]
y = [:]
print(x) #[1,2,3]
print(y) #[1,2,3]
x1 = [[1,2,3],[4,5,6][7,8,9]]
y = x.copy
x[1][1] = 0
print(x) #[[1,2,3],[4,0,6][7,8,9]]
print(y) #[[1,2,3],[4,0,6][7,8,9]]
#深拷贝
import copy
x = [[1,2,3],[4,5,6][7,8,9]]
y = copy.copy(x) #copy模块的一个函数 (浅拷贝)
x = [[1,2,3],[4,5,6][7,8,9]]
y = copy.deepcoy(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]]
4. 列表推导式
列表推导式的结果一定是列表,所以要先写上一对方括号。
列表推导式的基本语法:[expression for target in iterable] ,expression是一个表达式,右边是一个循环体
#ord()将单个字符串转化为对应的编码
oho = [1,2,3,4,5]
for i in range(len(oho)):
oho[i] = oho[i] * 2
oho #[2,4,6,8,10]
oho=[1,2,3,4,5]
oho=[i * 2 for i in oho] #这就是列表推导式,速度会快上一倍
oho #[2,4,6,8,10]
x = [i for i in range(10)]
x #[0,1,2,3,4,5,6,7,8,9]
x = [i+1 for i in range(10)]
x #[1,2,3,4,5,6,7,8,9,10]
x = []
for i in range(10):
x.append(i+1)
x #[1,2,3,4,5,6,7,8,9,10]
y = [c * 2 for c in "Fishc"]
y #['FF','ii','ss','hh','cc']
code = [ord(c) for c in "Fishc"] #ord()将单个字符串转化为对应的编码
code #[70,105,115,104,67]
取出矩阵特定的数据:
取出矩阵第二列:先通过循环取出列表的每一行,然后通过row[1] 取出每一行下标1的元素。
去矩阵对角线元素:[0][0], [1][1], [2][2]
matrix = [[1,2,3],
[4,5,6],
[7,8,9]]
#通过列表推导式将矩阵第二列提取出来
col2 = [row[1] for row in matrix]
col2 #[2,5,6]
diag = [matrix[i][i] for i in range(len(matrix))
diag #[1,5,9]
练习题:使用列表推导式(先用循环取出words里面每一个下标的单词,将单词赋值给i ,再用if 语句去判断 i[0] 下标的元素是否是 'F')
A = [0] * 3
for i in range(3):
A[i] = [0] * 3
A #[[0,0,0],[0,0,0],[0,0,0]]
A[1][1]=1
A #[[0,0,0],[0,1,0],[0,0,0]]
S = [[0] * 3 for i in range(3)]
S #[[0,0,0],[0,0,0],[0,0,0]]
even = [i for i in range(10) if i % 2 == 0]
even #[0,2,4,6,8]
#使用列表推导式筛选出F开头的单词
words = ["Great","Fishc","Brilliant","Excellent","Fantistic"]
words = [i for i in words if i[0] == 'F']
words #['Fishc','Fantistic']
实现二维列表降级为一维列表:嵌套的列表推导式实现嵌套的循环。
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]
flatten = []
for row in matrix:
for col in row:
flatten.append(col)
[x + y for x in "fishc" for y in "FISHC"]
#笛卡尔乘积
_=[]
for x in "fishc":
for y in "FISHC":
_.append(x + y)
[[x,y] for x in range(10) if x % 2 == 0 for y in range(10) if y % 3 == 0]