目录
一、列表
1.1 什么是列表
列表就是就是使用一对中括号 " [] " 将所有准备放入列表中元素包裹起来,不同元素之间以逗号 “,” 分隔。
eg:
但若想按顺序访问序列列表上的每一个元素,可以使用for循环:
获取指定索引的值:
1.2 列表切片
1.3 列表的增删改查
1.3.1 增
append()
: 在末尾添加一个元素
extend()
: 参数必须是一个可迭代对象,新的内容是追加到原列表最后一个元素后面。
insert(索引,元素)
: 第一个参数指定待插入的位置,第二个参数指定插入元素。
1.3.2 删
remove(): 如果列表中存在多个匹配的元素,那么它只会删除第一个。
如果指定的元素不存在,那么程序就会报错。
pop(索引):删除指定位置的元素。
clear(): 清空列表元素。
1.3.3 改
列表是可变的,而字符串是不可变的。但都可以使用下表索引的方法,使用赋值运算符将新的值替换进去。
替换其实是分两步完成的:
a. 将 = 左边指定的内容删除;
b. 将 = 右边的可迭代对象中的片段插入左边被删除的位置。
sort()
: 按从小到大的顺序进行排序。
sort(key=None, reverse=False): 对列表中的元素进行原地排序,(key参数用于指定一个用于比较的函数;reverse函数用于指定排序结果是否反转)
reverse()
: 顺序颠倒,只进行调换顺序,而不是排序。
1.3.4 查
count(): 查找某个元素出现的次数。
index(): 查找某个元素的索引值。
如果有多个相同元素,会返回第一个找到的元素下标值。
index(x,start,end): 指定查找的开始和结束位置。
shallow copy 浅拷贝:
copy(): 拷贝一个列表
列表名[:]:使用切片进行拷贝
1.4 列表的加法和乘法
concatenation and multiplication of list
列表的乘法:重复列表内的所有元素若干次。
1.5 嵌套列表
nested list
1.6 访问嵌套列表
access nested list
列表名[x]: 如果只给出一个下标索引的话,得到以行为单位的整个列表,而非嵌套列表中的元素。
列表名[n][m]: 访问列表中第n行,第m列。想要访问列表中的列表元素,需要使用两次下标索引。
可以通过循环语句来创建并初始化二维列表:
B 修改一个元素,影响三个元素,是因为内部嵌套的列表不是三个独立的列表,而是对同一个列表的三次引用。
可以通过 is 运算符来比较 A[] B[] 列表里是否是同样的元素。
1.7 is运算符
is operator
字符串不可变,列表可变。
A 是先创建一个列表 A[], 复制三份,然后再给里面填充元素。
B 对于内嵌的列表只是拷贝了列表的引用,而非物理上的拷贝。
1.8 变量不是盒子
Variables are not boxes
不可以直接使用赋值的方式来拷贝一个列表,赋值只是赋给的是引用。
若想复制一模一样的列表,只能使用拷贝。
二、 浅拷贝和深拷贝
shallow and deep copy
2.1 浅拷贝
copy(): copy()方法拷贝的是整个列表的对象,而不仅是变量的引用。
y = x.copy(): 切片拷贝。
浅拷贝只拷贝了外层的对象,对于嵌套列表的话只是拷贝了其引用。
🌟 所以浅拷贝只适用于一维列表,要对二维列表进行拷贝需使用到深拷贝。
2.2 深拷贝
copy.copy():浅拷贝, copy模块的copy() 函数。
copy.deepcopy():深拷贝,函数将原对象拷贝的同时,也将对象中所有引用的子对象一并进行拷贝。
eg:
copy.deepcopy() 深拷贝
copy.copy() 浅拷贝
三、列表推导式
list comprehension expression
-
请问如何将列表中的每一个元素的值都变成原来的2倍?
列表推导式在python解释器里是以更快的C语言的速度来运行的,所以比使用python脚本的虚拟机pvm运行的for循环的速度快很多。 -
那么列表推导式是如何构建的?
[expression for target in iterable]
列表推导式首先是一个列表,使用数据来填充列表,需要for语句来搭配,expression相当于一个表达式,相当于循环体,经过运算才决定存放在列表中的数据。
eg:
列表推导式存放数值
列表推导式存放字符串
- 如何将所有的字符都转换成对应的Unicode编码并保存为列表?
ord(): ord() 内置函数将单个字符串转换为对应的编码。
- 如何通过列表推导式将矩阵matrix第二列的元素提取出来?
先通过for循环取出每一行,再通过 row[1] 过滤下标为1 即第二列的元素:
- 如何通过列表推导式将矩阵matrix ↘️斜对角的元素提取出来?
matrix[i][i] 内的值是相同的,即第i行第i列,所以为对角线的值。此处 i = range(3),将 i = 0, 1, 2 带入matrix[i][i]
从for循环里拿出来的只是对应的索引值 [0] [1] [2],即matrix[0][0], matrix[1][1], matrix[2][2].
-
如何取 矩阵matrix ↗️ 斜对角的元素?
-
循环与列表推导式是一样的吗?
不一样,因为循环是通过迭代来逐个修改原列表中的元素,而列表推导式则是直接创建一个新的列表,然后再赋值为原先的这个变量名。 -
使用列表推导式创建一个嵌套列表
-
列表推导式还可以添加一个用于筛选的if分句:
语法:
[expression for target in iterable if condition]
执行顺序:先执行 for语句 再执行if语句 最后执行for左边的表达式。
eg:
分别筛选出10以内的偶数和奇数:
eg:
筛选出以下字符串中以 “C” 开头的单词:
- 列表推导式实现嵌套
语法:
[expression for target1 in iterable1
for target2 in iterable2
...
for targetN in iterableN]
嵌套的列表推导式对应嵌套的循环。
eg:
将二维列表铺开,即进行降维。
eg:
将 x y 两个字符串相加组成一个新的列表:
- 列表推导式的终极语法:
[expression for target1 in iterable1 if condition1
for target2 in iterable2 if xondition2
...
for targetN in iterableN if conditionN]
eg:
输出一个列表 [x,y], x是偶数,y是奇数:
tips:如果某个变量是临时的或无关紧要的,可直接使用下划线 "_"当变量名。
一定注意缩紧!!!!!!!!!!!!!!!!!!!!!!!
KISS原则:Keep It Simple & Stupid.