1. 关于列表的大坑
1.1 删除列表内特定的元素
方法1:存在元素删除法
每次执行存在运算,均从头到尾遍历列表查找,效率极低
ls = ["d", "d", "d", "2", "2", "d", "d", "4"]
s = "d"
while True:
if s in ls:
ls.remove(s)
else:
break
print(ls)
# ['2', '2', '4']
方法2:一次性遍历元素 删除法
ls = ["d", "d", "d", "2", "2", "d", "d", "4"]
for s in ls:
if s == "d":
ls.remove(s) # remove(s) 删除列表中第一次出现的该元素
print(ls)
# ['2', '2', 'd', 'd', '4']
大坑!!!正向索引的时候,某些元素可能会被跨过没访问到
为了弄清楚原理和过程,人为的给"d" 加了一个标签
ls = ["d1", "d2", "d3", "2", "2", "d4", "d5", "4"]
在 for s in ls 时,从索引 0 位置开始遍历,首先发现 ls[0] == “d”,因此删除ls[0]位置的"d"。
然后继续遍历,因为之前已经遍历完了’ls[0]'这个位置,因此继续遍历时跳过 ls[0],直接访问 ls[1],但其实此时的 ls 已经变了,ls[1] 实际是"d3"。不过,因为 ls[1] == “d”,因此执行remove,而remove删除的是列表中第一次出现的该元素,所以反而如愿的把"d2"删掉了。
然后继续遍历,这次直接到了 ls[2],此时的 ls=[“d3”, “2”, “2”, “d4”, “d5”, “4”],所以 ls[2] 是 “2”,继续遍历,发现 ls[3]==“d”,因此执行remove删掉了第一次作为"d"出现的"d3"。
然后继续遍历,到了 ls[4],此时的 ls=[“2”, “2”, “d4”, “d5”, “4”],所以ls[4]==“4”,不执行remove,遍历完毕。
解决办法:使用负向索引
ls = ["d", "d", "d", "2", "2", "d", "d", "4"]
for i in range(0, len(ls), -1):
if ls[i] == "d":
ls.remove(ls[i]) # remove(s) 删除列表中第一次出现的该元素
print(ls)
# ['2', '2', '4']
1.2 多维列表的创建
[ ] *5 的复制,实际上这5个小列表指向的都是同一个列表
2. 解析语法构造列表
2.1 基本结构
以列表为例,
[expression for value in iterable if condition]
三要素:表达式,可迭代对象,if 条件(可选)
执行过程:
1.从可迭代对象中拿出一个元素
2.通过 if 条件,对元素进行筛选
3.通过筛选的元素被传递给表达式,得到一个结果
4.将结果作为列表的一个元素进行存储
5.重复1-4,直到可迭代对象迭代结束,返回新列表
[expression for value in iterable if condition]
## 等价于
result = []
for value in iterable:
if condition:
result.append(expression)
2.2 列表解析的例子
【例1】求20以内的奇数的平方
squares = []
for i in range(1, 21):
if i%2 == 1:
squares.append(i**2)
print(squares)
# [1,9,25,49,81,121,169,225,289,361]
squares = [i**2 for i in range(1,21) if i%2 == 1]
print(squares)
# [1,9,25,49,81,121,169,225,289,361]
【例2】多变量
x = [1, 2, 3]
y = [1, 2, 3]
res = [i*j for i,j in zip(x,y)]
print(res)
# [1, 4, 9]
【例3】循环嵌套
colors = ["black", "white"]
sizes = ["s", "m", "l"]
tshirts = ["{} {}".format(col, siz) for col in colors for siz in sizes]
tshirts
# ['black s', 'black m', 'black l', 'white s', 'white m', 'white l']
3. 解析语法构造其他
3.1 构造字典
squares = {i: i**2 for i in range(5)} ## 构造字典是大括号{}
for k, v in squares.items():
print(k, ": ", v)
## 打印字典是键值对 k:v
0: 0
1: 1
2: 4
3: 9
4: 16
3.2 构造集合
squares = {i**2 for i in range(5)} ## 构造集合也是大括号{}
squares
## 打印集合还是大括号
{0, 1, 4, 9, 16}
4. 条件表达式
expr1 if condition else expr2
n = -10
x = n if n>0 else -n
print(x)
## 10
相当于
n = -10
if n>0: x = n
else: x = -n
print(x)
## 10
转载:https://blog.csdn.net/weixin_43026262/article/details/105878409